理解JavaScript原型

什么是原型?

原型是一个对象,其他对象可以通过它实现属性继承。

任何一个对象都可以成为原型么?

哪些对象有原型

所有的对象在默认的情况下都有一个原型,因为原型本身也是对象,所以每个原型自身又有一个原型(只有一种例外,默认的对象原型在原型链的顶端。)

当我们已经创建了一个实例对象 ,我们想要这个实例对象继承一个已经存在的对象的功能比如说Array,就可以使用原型

 

函数A的原型属性(prototype property )是一个对象,当这个函数被用作构造函数来创建实例时,该函数的原型属性将被作为原型赋值给所有对象实例(注:即所有实例的原型引用的是函数的原型属性)

有一个原型属性,这和函数的原型是不一样的
b.prototype //[object Object]   函数b的原型属性

b.__proto__ 或者b.construtor.prototype 函数的原型

//创建一个函数b
var b = function(){ var one; }
//使用b创建一个对象实例c
var c = new b();

1 b的构造函数
b.constructor;  // function Function() { [native code]}
2 实例c的构造函数
c.constructor; // 即 b function(){ var one; }

b.constructor==Function.constructor;
c.constructor==b;

3 b的原型
b.constructor.prototype // function (){}
b.__proto__  //function (){}

4 函数b的原型属性
b.prototype //[object Object]   

5 c的对象的原型
c.constructor.prototype //[object Object] 
c.__proto__ //[object Object] 

//为函数b的原型属性添加一个属性max
b.prototype.max = 3
//实例c也有了一个属性max
c.max  //3
上面的例子中,对象实例c的原型和函数的b的原型属性是一样的,如果改变b的原型属性,则对象实例c
的原型也会改变

  

2  js原型链原理看图说明 太简洁了,最后一个图看不懂呀

当你去定义一个prototype的时候,相当于把该实例的__proto__指向一个结构体,那么这个被指向结构体就称为该实例的原型。 

 

JavaScript探秘:强大的原型和原型链

var BaseCalculator = function() { 
    this.decimalDigits = 2;
};

BaseCalculator.prototype = {
    add: function(x, y) { 
        return x + y;
    },
    subtract: function(x, y) {
      return x - y;
    } 
};

创建完上述代码以后,我们来开始:

var Calculator = function () {

    //为每个实例都声明一个税收数字

    this.tax = 5;
};

Calculator.prototype = new BaseCalculator();        

  我们可以看到Calculator的原型是指向到BaseCalculator的一个实例上,目的是让Calculator集成它的add(x,y)和subtract(x,y)这2个function,还有一点要说的是,由于它的原型是BaseCalculator的一个实例,所以不管你创建多少个Calculator对象实例,他们的原型指向的都是同一个实例。

属性在查找的时候是先查找自身的属性,如果没有再查找原型,再没有,再往上走,一直插到Object的原型上

hasOwnProperty是Object.prototype的一个方法,它可是个好东西,他能判断一个对象是否包含自定义属性而不是原型链上的属性,因为hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数。