理解prototype和__proto__(继承与原型链)

从关系图中可以看出来,ECMAScript中创建一个对象是通过new构造函数实现的,而本质上来说这个对象其实是以构造函数的属性prototype指向的对象为基本模板的,因此新对象的__proto__属性表明了自己来源于谁。

prototype

该属性用来指向创建一个对象的基本模板,默认指向new构造函数,也可以修改,或者通过改属性为新对象添加属性。

需要注意的是,该属性只有函数才有。

//构造函数
function Clazz(name) {
    this.name = name;
}

//创建对象
var clazz = new Clazz('你好2007');

//通过prototype给对象添加方法
Clazz.prototype.getName = function () {
    alert(this.name);
};

clazz.getName();

proto

这个是对象上的属性,比较有意思,因为不是标准中规定的,使用的时候要小心。

该属性的意思指创建该对象的构造函数的prototype,因此你可以通过对象的该属性修改原型。

function Clazz(name) {
    this.name = name;
}

var clazz = new Clazz('你好');
var clazz2 = new Clazz('2007');

//通过__proto__给原型添加方法,这样创建的对象也会有该方法
clazz2.__proto__.getName = function () {
    alert(this.name);
};

clazz.getName();

你可能感兴趣的:(理解prototype和__proto__(继承与原型链))