浅谈对js原型的理解

  一.  在JavaScript中,一切皆对象,每个对象都有一个原型对象(prototype),而指向该原型对象的内部指针则是__proto__。当我们对对象进行for in 或者for of遍历时,就会通过__proto__依次遍历对象关联的所有对象。这就是原型链,遍历所有对象的父对象直到object直至null。

function Person(name,work){
    this.name = name;
    this.work = work;    
}
Person.prototype.show = function(){
    console.log(this.name);
}
var person = new Person('nicknailo','全栈开发');
console.log(person.__proto__ === Person.prototype); //true
console.log(Person.prototype.__proto__);//Object 或者{}
console.log(person.__proto__.__proto__.__proto__);//null
console.log(Person.prototype);//Person { show: [Function] }

       person对象的原型指向 Person.prototype,Person.prototype指向object,object 指向 null。蕴含了一个哲理,无中生有。

  二.

JavaScript原型链分析图

这是一张描述了Object、Function以及一个函数实例Foo他们之间原型之间联系。如果理解了上面的概念,这张图是不难读懂。

Function.prototype.proto 指向了 Object.prototype,这说明Function.prototype 是一个 Object实例,那么应当是先有的Object再有Function。

但是Object.prototype.constructor.proto 又指向了 Function.prototype。这样看来,没有Function,Object也不能创建实例。

 

 

  三.Person.prototype只是对象的原型上(constructor)扩展的属性。

var animal = function(){};
var dog = function(){};

animal.price = 2000;
dog.prototype = animal;
var tidy = new dog();
console.log(dog.price + " : dog.price");//undefined : dog.price
console.log(tidy.price + " : tidy.price"); //2000 : tidy.price

  上述代码可以看出来,实例tidy只与原型对象dog.prototype存在关联,上面的代码可以看成是  dog.prototype.price = 2000;

posted @ 2018-03-13 20:31  nicknailo  阅读(222)  评论(0编辑  收藏  举报