JavaScript中的对象
基于对象
JavaScript 是一门基于对象的语言,因为 JavaScript 中大部分内容都是由对象构成的,可以说 JavaScript 就是建立在对象上的语言。
JavaScript 中的对象是指一组组属性和值组成的集合
45
属性描述符
- configurable:是否可配置(delete,defineObject 是否可以设置成功)
- enumerable:是否可枚举(forin,Object.keys())
- value:值
- writable:是否可改写
- set:set 访问器
- get:get 访问器
数据属性:value+writable;访问器属性:set+get;一次只能有 4 个属性
关于继承
JavaScript 中使用原型和原型链实现继承。
虽然在 ES6 中引入了 class 关键字,但那只是 function 的一个语法糖,其本质还是 prototype。
JavaScript 中每个对象都有一个proto属性 ,proto指向了内存中另外一个对象,我们就把这个对象称之为对象的原型对象。

继承的实现
在开发中,我们不推荐直接修改对象的__proto__属性实现继承,而是要使用构造函数。
所有现代的 js 引擎都深度优化了获取和设置对象属性的行为,因为这些都是一些常见的 js 操作。这些优化都是基于引擎对对象结构的认识上。当更改了对象的内部结构(如添加或删除该对象或其原型链中的对象的属性),将会使一些优化失效。修改__proto__属性实际上改变了继承结构本身,这可能是最具破坏性的修改。
new 做了什么?
- 首先,创建了一个空白对象 `
- 将 DogFactory 的 prototype 属性设置为 dog 的原型对象,这就是给 dog 对象设置原型对象的关键一步
- 再使用 dog 来调用 DogFactory,这时候 DogFactory 函数中的 this 就指向了对象 dog,然后在
DogFactory函数中,利用 this 对对象 dog 执行属性填充操作,最终就创建了对象 dog。
function DogFactory(type,color){
this.type = type
this.color = color
}
var dog = new DogFactory('Dog','Black')
=======
var dog = {}
dog.__proto__ = DogFactory.prototype
DogFactory.call(dog,'Dog','Black')
实现继承
使用 prototype 挂载属性,因为对象的proto指向了构造函数的 prototype。
function DogFactory(type, color) {
this.type = type;
this.color = color;
//Mammalia
}
DogFactory.prototype.constant_temperature = 1;
var dog1 = new DogFactory("Dog", "Black");
var dog2 = new DogFactory("Dog", "Black");
var dog3 = new DogFactory("Dog", "Black");
本文来自博客园,作者:jinzhepro,转载请注明原文链接:https://www.cnblogs.com/jinzhepro/p/19234063

浙公网安备 33010602011771号