- 概念
- prototype
__proto__
- 原型链查找机制
- 万物皆对象
- 判断私有/共有属性方法
- Object.prototype.prototype === null
- Object.create(proto, [propertiesObject])
- 给类的原型上扩展属性方法的4种方法
- Fn.prototype.xxx = xxx
- Object.prototype.xxx = xxx
- f1.proto.xxx = xxx
- 原型重定向
概念
原型:每个函数都有一个属性(原型对象):prototype
==》对象
构造函数:在prototype原型对象中,默认存在一个内置属性:constructor
==》函数
属性值就是当前函数本身,可修改
原型链:每个对象都具有一个属性:__proto__
==> 对象
属性值就是当前实例所属类
的prototype原型对象
原型链查找机制
- 首先找自己的
私有属性
,私有属性有,则调取私有属性 - 如果没有,默认基于__proto__原型链,找
所属类prototype原型对象上
的公共属性和方法 - 如果没有,则沿着prototype原型对象的__proto__原型链继续往上找
直到找到Object.prototype原型对象
为止
万物皆对象
JS的所有值
(除了undefined,null),基于__proto__原型链,都能找到Object.prototype原型对象,都是对象类的实例,也就是对象
Object.prototype.proto === null
Object的prototype原型对象是所有对象的基类
,__proto__原型链属性为 null
Object.create(proto,[propertiesObject])
定义:创建一个新对象
参数1:指定该对象的prototype原型对象,必须为对象或null
参数2:传入一个对象(描述对象),默认为undefined
var obj = Object.create({ a: 1 }, {
// foo会成为所创建对象的数据属性
b: {
writable: true,//是否可重写
configurable: true,//是否可枚举
enumerable: true,//是否可删除和修改特征
value: "hello"//属性的值
},
// bar会成为所创建对象的访问器属性
c: {
get: function () { return 10 },// 取值器
set: function (value) { // 赋值器
console.log("设置的值为", value);
}
}
})
Object.create(null)
定义:创建一个所属类的prototype原型对象为null的空对象
var obj = Object.create(null);
console.log(obj.prototype);//undefined 对象没有pototype这个属性
console.log(obj.__proto__);// undefined
给类的原型上扩展属性方法的4种方法
- Fn.prototype.xxx = xxx
向默认开辟的堆内存中扩展属性方法 - Object.prototype.xxx = xxx
内置类原型
上扩展方法 - f1.proto.xxx = xxx
基于实例的所属类的原型对象上
扩展属性方法
注意:IE中,禁止操作__proto__ - 原型重定向
手动开辟一个堆内存赋值给 fn.prototype
例题
经典题目1
经典题目2