
获得徽章 7
- Object.create(...)的第二个参数指定了需要添加到新对象中的属性名以及这些属性的属性。
var myObject = Object.create( anotherObject, {
b: {
enumerable: false,
writable: true,
configurable: false,
value: 3
},
c: {
enumerable: true,
writable: false,
configurable: false,
value: 4
}
});
myObject.b; // 3
myObject.c; // 4展开评论点赞 - Object.create(...)的polyfill代码:
if(!Object.create){
Object.create = function(o){
function F(){};
F.prototype = o;
return new F();
};
};
这段polyfill代码使用了一个一次性函数F,通过改写它的.prototype属性使其指向想要关联的对象,然后再使用new F()来构造一个新对象进行关联。展开评论点赞 - Object.create(...)会创建一个新对象,并把它关联到我们制定的对象,这样我们就可以充分发挥[[prototype]]机制的威力(委托)并且避免不必要的麻烦(比如使用new的构造函数调用会生成.prototype和.constructor)。Object.create(null)会创建一个拥有空(或者说null)[[prototype]]链接的对象,这个对象无法进行委托。展开评论点赞
- [[prototype]]机制就是存在于对象中的一个内部链接,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就会继续在[[prototype]]关联的对象上进行查找。同理,如果在后者中也没有找到需要的引用就会继续查找它的[[prototype]],以此类推,这一系列对象的链接被称为“原型链”。评论点赞
- .__proto__的实现大致是如下这样的:
Object.defineProperty(Object.prototype,'__proto__',{
get:function(){
return Object.getPrototypeOf(this);
},
set:function(o){
Object.setPrototypeOf(this,o);
return o;
}
};展开评论点赞 - 我们也可以直接获取一个对象的[[prototype]]链,在ES5中,标准的方法是:Object.getPrototypeOf(a);浏览器也支持一种非标准的方法来访问内部[[prototype]]属性:a.__proto__ ==== Foo.prototype;//true。评论点赞
- isPrototypeOf()回答的问题是:在a的整条[[prototype]]链中是否出现过Foo.prototype。Foo.prototype.isPrototypeOf(a);//true评论点赞