原型、原型链
-
构造函数
js中,当使用new操作符来作用于某个函数时,这个函数被视为构造函数(构造器); -
原型
js中,所有对象都具有一个私有属性:_proto_,所有的构造函数都具有一个原型对象:prototype,对象的_proto_指向其构造函数的原型对象;
例如
fun(){...};
var ob = new fun();
则
ob._proto_ = fun.prototype;
- 原型链
在上例中,实例对象ob的原型对象指向构造函数的原型对象fun.prototype,而fun.prototype作为一个对象,也有其自己的原型对象,依次类推,构成原型链;
由于基本上所有的对象都是Object的实例,故原型链的最顶端为Object.prototype;Object.prototype的原型对象为null,js规定,null没有原型对象;
实例继承原型链上的所有属性,当没有某个属性时,会沿着原型链向上寻找;
//基本的原型链
ob --> fun.prototype --> Object.prototype--> null
var oc = Object.create(ob)
//使用Object.create创建对象,参数为原型对象
//oc对应的原型链为
oc --> ob --> fun.prototype--> Object.prototype--> null
var oa = [1,2,3];
//oa对应的原型链为
oa --> Array.prototype--> Object.prototype --> null
- 拓展原型链
四种方式,以fun(){...},sun(){...}为例:
//1
var obj = new fun();
obj.name = 'XXX';
sun.prototype = obj;
//2
var obj = Object.create(fun.prototype);
obj.name = 'XXX';
sun.prototype = obj;
//3 不推荐
var obj = {name:'XXX'};
Object.setPrototypeOf(obj,fun.prototype);
sun.prototype = obj;
//4 不推荐
var obj = {
name : 'XXX',
_proto_ : fun.prototype
}
sun.prototype = obj;
内容提自> https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

浙公网安备 33010602011771号