《你不知道的Javascript--上卷 学习总结》(原型)

[[Prototype]]

一、Javascript中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其余对象的引用。几乎全部的对象在建立时[[Prototype]] 属性都会被赋予一个非空的值。bash

二、当咱们获取一个对象的值的时候,首先会执行默认的[[Get]]操做来讲,若是没法在对象自己找到须要的属性,就会继续访问对象的[[Prototype]]链函数

三、全部普通的[[Prototype]]链最终都会指向内置的Object.prototype.ui

四、若是咱们想给一个对象赋值的时候,这个属性既出如今myObject中也出如今myObject的[[Prototype]]链上层,那么就会发生屏蔽。若是不存在myObject上而是存在原型链上,会出现下面这些状况。spa

myObject.foo = 'bar'
复制代码
  • 若是在[[Prototype]]链上层存在名为foo的普通数据访问属性而且没有被标记为只读,那就会直接在myObject中添加一个名为foo的新属性,它是屏蔽属性
  • 如第一条,若是被标记为只读,则没法修改已有属性或者在myObject上建立屏蔽属性
  • 若是在[[Prototype]]链上层存在foo而且它是一个setter,那就必定会调用这个setter。foo不会被添加到myObject,也不会从新定义foo这个setter。

若是但愿上面二和三条也发生屏蔽,就不能使用=操做符来赋值,而是使用Object.defineProperty来向myObject添加foo。prototype

function Foo(){
        
    }
    
    Foo.prototype.constructor === Foo // true
    var a = new Foo();
    a.constructor === Foo // true  实际a上并无constructor,而是经过prototype来查找到的Foo的constructor
复制代码

Foo.prototype默认有一个公有而且不可枚举的属性.constructor,这个属性引用的是对象关联的函数.code

两种方法把Bar.prototype关联到Foo.prototype:对象

Bar.prototype = Object.create(Foo.prototype)
    
    Object.setPrototypeOf(Bar.prototype,Foo.prototype)
复制代码

instanceof 操做符的左操做数是一个普通的对象,右操做数是一个函数.判断左侧的对象是不是右侧函数的实例。ip

isPrototypeOf 判断左侧对象是否出如今右侧对象的[[prototype]]链中。原型链

getPrototypeOf(a) 获取a的原型get

b.isPrototypeOf(c) 
    
    Object.getPrototypeOf(a)
复制代码

Object.create的polyfill代码(这个polyfill有一个问题,就是不支持第二个参数(属性描述符))

if(!Object.create){
        Object.create = function(o) {
            function F(){}
            F.prototype = o;
            return new F();
        }
    }
    
    var myObject = Object.create(anotherObject,{
        b:{
            enumerable:false,
            writable:true,
            configurable:false,
            value:3
        }
    })
复制代码
相关文章
相关标签/搜索