阿尔卑斯丶
圣骑士
圣骑士
  • 最后登录2022-01-08
  • 发帖数51
  • 社区居民
  • 原创写手
阅读:95回复:0

[javascript]JavaScript面向对象还是基于对象

楼主#
更多 发布于:2022-01-04 15:56
1、为什么在JavaScript对象里可以自由添加属性?
答:因为JavaScript采用的面向对象机制是基于原型的机制,而不是传统语言的基于类的机制。参考JavaScript继承机制的设计思想,加上基于原型的语言提倡运行时的原型修改;在JavaScript中可以在自由添加属性是因为为了实现动态性可以这样设计的。
2、什么是面向对象?
答:在不同的编程语言中,设计者也利用各种不同的语言特性来抽象描述对象。类和原型是编程语言来抽象描述对象的两种不同方式。因为政治原因JavaScript模仿Java,所以在原型运行时的基础上引入了new this等语言特性。
3、JavaScript对象的特征。
答:a、对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。(这里的完全相同的对象是看起来完全相同的对象。)
b、对象有状态:同一对象可能处于不同状态之下。
c、对象具有行为:即对象的状态,可能因为它的行为产生变迁。
var o1 = { a: 1 };
var o2 = { a: 1 };
console.log(o1 == o2); // false

4、在JavaScript中,将状态和行为统一抽象为“属性”。
var o = { 
    d: 1,
    f() {
        console.log(this.d);
    }    
};

5、JavaScript中对象独有的特色是:对象具有高度的动态性,这是因为JavaScript赋予了使用者在运行时为对象添加状态和行为的能力。
var o = { a: 1 };
o.b = 2;
console.log(o.a, o.b); //1 2

6、JavaScript对象的两类属性
答:数据属性和访问器属性
数据属性特征:
value:就是属性的值
writable:决定属性能否被赋值
enumerable:决定for in 能否枚举该属性
configurable:决定该属性能否被删除或者改变特征值
大多数情况下我们只关心数据属性的值即可。
访问器属性的特征:
getter:函数或者undefined,在取值时被调用
setter:函数或者undefined,在设置值时被调用
enumerable:决定for in 能否枚举该属性
configurable:决定该属性能否被删除或者改变特征值
我们通常用于定义属性的代码会产生数据属性,其中writable、enumerable、configurable 都默认为 true。我们可以使用内置函数 getOwnPropertyDescriptor 来查看。
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}

如果我们想改变属性的特征,或者定义访问器属性,我们可以使用Object.defineProperty。
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



7、在创建对象时,也可以使用get和set关键字来创建访问器属性。


var o = { get a() { return 1 } };

 console.log(o.a); // 1
游客


返回顶部

公众号

公众号