js原型链那些事

189 阅读1分钟

知识前导

要理解原型链,我们要知道js中所有对象都是Object的实例,object可以理解成一个大的构造函数,所有的对象都继承Object.prototype的属性和方法。Object.prototype是所有对象的父级。

三个重要知识点

1、对象有两个特有属性__proto__、constructor

2、函数有一个特有属性prototype

3、每个构造函数new出来的对象都有一个属性__proto__,他指向的是他的构造函数的prototype属性,也就是说,他们完全相等。看下面代码

function Foo(){
    this.name = 'li';
    this.age = 13;
    this.say = function(){
        console.log('hello world');
    }
}
var f1 = new Foo();
console.log(Foo.prototype === f1.__proto__)//ture

而每一个原型对象同样有一个constructor指回构造函数,如下代码

function Foo(){
    this.name = 'li';
    this.age = 13;
    this.say = function(){
        console.log('hello world');
    }
}
console.log(Foo.prototype.constructor);//[Function: Foo]
console.log(f1.constructor);
//[Function: Foo]

上述代码中,f1.constructor指向的是Foo,我的理解是,他并不一个构造函数的原型方法,说以他指向他的构造函数。

原型链

有了上面的知识了解,我们解释一下原型链,原型链就是一个构造函数实例化出来的对象,当自身不存在一个属性时,通过__proto__属性去查找父级的原型对象,如果没有找到,就继续向上找,直到找到Object.prototype他是没有__proto__属性的,所以等于与null原型链结束。

function Foo(){
    this.name = 'li';
    this.age = 13;
    this.say = function(){
        console.log('hello world');
    }
}
Foo.prototype.sex = '男';
var f1 = new Foo();
console.log(f1.name);//构造函数中存在,是直接输出'li'
console.log(f1.sex);//构造函数中未找到,查找Foo.prototype,找到后直接输出
console.log(f1.weight);//构造函数中未找到,查找Foo.prototype未找到,查找Object.prototype == null,返回undefined