关于JS原型原型链继承的问题
Posted wk-ba
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JS原型原型链继承的问题相关的知识,希望对你有一定的参考价值。
任何对象都是被构造出来的,构造对象的方法称为构造函数,构造函数生成的对象为构造函数的实例。声明一个对象可以var obj = {},也可以var obj = new Object(),前者只是语法糖,等同于new Object。我们称Object是一个构造函数,任何对象都是由Object所构造出来的。
一、原型
我们也可以自己定义构造函数并且书写构造函数的原型(prototype)
例如:
function Person(name){
this.name = name;
}
Person.prototype = { //注意:定义构造函数的原型,且要写在实例化之前
say:function() {
console.log(this.name)
}
}
二、继承
如上,我们已经定义好了构造函数,书写好了构造函数的原型,下面进行实例化:
var p1 = new Person("james"); //p1 = { name:"james"}
p1.say(); //"james"
我们发现,p1 对象上并没有say()方法,但却可以调用,这是因为p1继承了其构造函数的原型上的方法。如何继承的呢?
每个实例化对象上面都有一条隐式的__proto__属性,它指向着构造函数的原型:
p1.__proto__ === Person.prototype,我们称p1是由Person所构造出来的
当调用p1.say()方法时,p1对象没有say这个条属性,它会去自己的__proto__上面查找,找到后就能调用了
三、原型链
每个对象都有自己的原型__proto__,用于继承构造函数prototype上面的属性和方法,前面已经说过,prototype也是一个对象,那么它也有自己的__proto__也可以继承属性和方法,一层一层,最终都会指向Object这个关系就叫原型链:
p1.__proto__ === Person.prototype //true
Person.prototype.__proto__ === Object.prototype //true
Object.prototype.__proto__ === null //true
另外:
所有的函数(构造函数)也是被构造出来的,由Function所构造。
Function由顶层语言设计出来的,Object也是构造函数,所以也是由Function构造。
Object.__proto__ === Function.prototype //true
Object不是函数吗?哪来的__proto__?纳尼?你在逗我?
函数也是对象,是对象就存在__proto__,所以我只能这么理解了。
整理一下:
Fucntion 天上来
Function.__proto__ === Function.prototype //我生了我自己
Object.__proto__ === Function.prototype //Function 生出了Object,构造Object同时就定义了Object.protoype
Function.prototype.__proto__ === Object.prototype //注意:这里的Function.prototype是函数,这是怎么回事呢?为了保证统一修改了指向,强行指向了Object.prototype
以上是关于关于JS原型原型链继承的问题的主要内容,如果未能解决你的问题,请参考以下文章