笔记申明
重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时候开的一个专栏,
天天10分钟,重构你的前端学问体系,笔者重要整顿进修历程的一些要点笔记以及感悟,完全的能够到场winter的专栏进修【原文有winter的语音】,若有侵权请联络我,邮箱:kaimo313@foxmail.com。
1、进修JavaScript面向对象时是不是有如许的迷惑?
- 为何 JavaScript(直到 ES6)有对象的观点,然则却没有像其他的言语那样,有类的观点呢?
- 为何在 JavaScript 对象里能够自在增加属性,而其他的言语却不能呢?
2、什么是面向对象?
2.1、JavaScript 对象的特性
2.1.1、对象的特性(来自《面向对象分析与设想》一书)
- 对象具有唯一标识性:纵然完全相同的两个对象,也并不是一致个对象。
- 对象有状况:对象具有状况,一致对象能够处于差别状况之下。
- 对象具有行动:即对象的状况,能够因为它的行动发生变迁。
关于第一点:
var a1 = { a: 1 };
var a2 = { a: 1 };
console.log(a1 == a2); // false
关于第二、三点:
-
c++
中称”状况和行动”为成员变量
和成员函数
-
java
中则称它们为属性
和要领
-
javaScript
中将状况和行动一致笼统为属性
winter举了个例子,代码以下:
var o = {
d: 1,
f() {
console.log(this.d);
}
};
上面代码中,o是对象,d是一个属性,而函数f也是一个属性,只是写法不一样,总结来讲,在JavaScript中,对象的状况和行动实在都被笼统为了属性。
2.1.2、JavaScript 中对象独占的特征
对象具有高度的动态性,这是因为 JavaScript 给予了使用者在运行时为对象添改状况和行动的才。
举例申明运行时怎样向一个对象增加属性:
var o = { a: 1 };
o.b = 2;
console.log(o.a, o.b); //1 2
为了进步笼统才,JavaScript的属性被设想成比别的言语越发庞杂的情势,它供应了数据属性和接见器属性(getter/setter)两类。
2.2、JavaScript 对象的两类属性
2.2.1、数据属性
4个特性:
-
value
:就是属性的值. -
writable
:决议属性可否被赋值. -
enumerable
:决议 for in 可否罗列该属性. -
configurable
:决议该属性可否被删除或许转变特性值.
2.2.2、接见器(getter/setter)属性
2.2.2.1、4个特性:
-
getter
:函数或 undefined,在取属性值时被挪用. -
setter
:函数或 undefined,在设置属性值时被挪用. -
enumerable
:决议 for in 可否罗列该属性. -
configurable
:决议该属性可否被删除或许转变特性值.
2.2.2.2、Object.getOwnPropertyDescripter 和 Object.defineProperty()
var o, d;
o = { get foo() { return 17; } };
d = Object.getOwnPropertyDescriptor(o, "foo");
// d {
// configurable: true,
// enumerable: true,
// get: /*the getter function*/,
// set: undefined
// }
o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
// d {
// configurable: true,
// enumerable: true,
// value: 42,
// writable: true
// }
o = {};
Object.defineProperty(o, "baz", {
value: 8675309,
writable: false,
enumerable: false
});
d = Object.getOwnPropertyDescriptor(o, "baz");
// d {
// value: 8675309,
// writable: false,
// enumerable: false,
// configurable: false
// }
实际上 JavaScript 对象的运行时是一个“属性的鸠合”,属性以字符串或许 Symbol 为 key,以数据属性特性值或许接见器属性特性值为 value。
2.3、小结
- 因为 JavaScript 的对象设想跟现在主流基于类的面向对象差别非常大,致使有“JavaScript 不是面向对象”如许的说法。
- JavaScript 言语规范也已明白申明,JavaScript 是一门面向对象的言语,跟JavaScript 的高度动态性的对象体系密不可分。
个人总结
看完winter的这篇文章深感本身的基本之柔弱,越隐约的东西越要清晰其本质,才坚持对事物的准确推断。