关于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

猜你喜欢

转载自www.cnblogs.com/wk-ba/p/10264896.html