前端-诗人
好看的皮囊千篇一律,有趣的灵魂万里挑一,感谢这么有趣的你到来

我对于原型的理解:

解析:   box  构造函数

      prototype   构造函数box的属性,指向一个对象

      box.prototype  构造函数box的属性prototype指向的对象,即原型对象。box的原型对象

      constructor  原型对象上面的属性,指向构造函数

      box1         构造函数box创建的实例,该实例拥有着构造函数box的原型对象box.prototype上的所有属性和方法

      [[prototype]] 实例box1上面的属性,用于指向构造函数box的原型对象box.prototype

1,创建的每一个函数都有一个prototype属性。这个属性是干什么用的呢??这个属性其实就是一个指针,指向一个对象。那么问题又来了,这个对象是什么呢,有什么用呢?一的是这个对象是原型对象(例如box.prototype。这个就是一个原型对象,是通过prototype指出来的。是包含所有实例共享的属性和方法)

2,使用原型的好处就是,可以让所有对象实例共享它包含的属性和方法。即不用在构造函数中定义对象实例的属性和方法,而是直接把这些信息添加到原型对象上面。如图所示

3,在默认情况下,所有的原型对象box.prototype都会自动获取一个constructor(构造函数)属性。它也是一个指针,指向的是prototype属性所在的函数(即box)。box.prototype.constructor指向的是box。通过这个box,我们可以继续为原型对象添加新的属性和方法

4,那实例是怎么和构造函数上面的原型对象连接,获取所有方法和属性的呢?

当调用构造函数box创建一个新实例(box1或box2)时,该实例(box1或box2)将包含一个指针(内部属性)指向构造函数(box)的原型对象(box.prototype)。ECMA第五版中管这个指针叫[[prototype]],但是在脚本中并没有标准的方式去访问[[prototype]]。但是在Firefox,Safari和Chrome都支持一个属性_proto_,但是在其他的实现中,该属性对脚本是不可见的。

重点是这个连接是存在于实例(box1或box2)和构造函数box的原型对象(box.prototype)之间,而不是存在于实例(box1或box2)和构造函数box之间。

 

 

但是我们可以通过isPrototypeOf()来确定实例和原型对象上面是否存在这种关系,如果[[prototype]]指向调用isPrototypeOf()方法的对象(box.prototype),就返回true

ECMAScript5增加了一个新方法Object.getPrototypeOf().在所有的支持实现中,这个方法返回[[prototype]]的值

5,虽然我们可以通过实例(box1或box2)访问保存在原型上面的值,但是我们却不能通过实例去重写原型中的值。如果我们在实例中添加一个属性,该属性与原型(box.prptotype)上面的一个属性同名,那我们就可以在实例中创建这个属性,将会屏蔽原型上面的那个属性

添加的这个属性只会阻止我们访问原型(box.prototype)中的那个属性(name),即使把实例上的那个属性设为null,也只是在实例上面修改,而不会恢复其指向原型的连接。

但是我们可以通过delect操作符去删除实例上面的那个属性。

6,使用hasOwnProperty()方法可以检查一个属性是存在于实例中,还是存在原型中?只在给定属性存在于对象实例中时,才会返回true。那么什么时候访问的是实例,什么时候访问的是原型就变得一清二楚了!!!!

 

 

posted on 2017-11-22 16:43  plane-  阅读(623)  评论(0)    收藏  举报