1、为什么在JavaScript对象里可以自由添加属性? 答:因为JavaScript采用的面向对象机制是基于原型的机制,而不是传统语言的基于类的机制。参考JavaScript继承机制的设计思想,加上基于原型的语言提倡运行时的原型修改;在JavaScript中可以在自由添加属性是因为为了实现动态性可以这样设计的。 2、什么是面向对象? 答:在不同的编程语言中,设计者也利用各种不同的语言特性来抽象描述对象。类和原型是编程语言来抽象描述对象的两种不同方式。因为政治原因JavaScript模仿Java,所以在原型运行时的基础上引入了new this等语言特性。 3、JavaScript对象的特征。 答:a、对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。(这里的完全相同的对象是看起来完全相同的对象。) b、对象有状态:同一对象可能处于不同状态之下。 c、对象具有行为:即对象的状态,可能因为它的行为产生变迁。 复制代码[code ]var o1 = { a: 1 }; var o2 = { a: 1 }; console.log(o1 == o2); // false[/code] 4、在JavaScript中,将状态和行为统一抽象为“属性”。 复制代码[code ]var o = { d: 1, f() { console.log(this.d); } };[/code] 5、JavaScript中对象独有的特色是:对象具有高度的动态性,这是因为JavaScript赋予了使用者在运行时为对象添加状态和行为的能力。 复制代码[code ]var o = { a: 1 }; o.b = 2; console.log(o.a, o.b); //1 2[/code] 6、JavaScript对象的两类属性 答:数据属性和访问器属性 数据属性特征: value:就是属性的值 writable:决定属性能否被赋值 enumerable:决定for in 能否枚举该属性 configurable:决定该属性能否被删除或者改变特征值 大多数情况下我们只关心数据属性的值即可。 访问器属性的特征: getter:函数或者undefined,在取值时被调用 setter:函数或者undefined,在设置值时被调用 enumerable:决定for in 能否枚举该属性 configurable:决定该属性能否被删除或者改变特征值 我们通常用于定义属性的代码会产生数据属性,其中writable、enumerable、configurable 都默认为 true。我们可以使用内置函数 getOwnPropertyDescriptor 来查看。 复制代码[code ]var o = { a: 1 }; o.b = 2; //a和b皆为数据属性 Object.getOwnPropertyDescriptor(o,"a") // {value: 1, writable: true, enumerable: true, configurable: true} Object.getOwnPropertyDescriptor(o,"b") // {value: 2, writable: true, enumerable: true, configurable: true}[/code] 如果我们想改变属性的特征,或者定义访问器属性,我们可以使用Object.defineProperty。 复制代码[code ]var o = { a: 1 }; Object.defineProperty(o, "b", {value: 2, writable: false, enumerable: false, configurable: true}); //a和b都是数据属性,但特征值变化了 Object.getOwnPropertyDescriptor(o,"a"); // {value: 1, writable: true, enumerable: true, configurable: true} Object.getOwnPropertyDescriptor(o,"b"); // {value: 2, writable: false, enumerable: false, configurable: true} o.b = 3; console.log(o.b); // 2[/code] 7、在创建对象时,也可以使用get和set关键字来创建访问器属性。 var o = { get a() { return 1 } }; console.log(o.a); // 1 |
|