Object.setPrototypeOf()
- Object.setPrototypeOf(),为现有对象设置原型,返回一个新对象
接收两个参数:第一个是现有对象,第二是原型对象。
2、new 命令通过构造函数新建对象实例的过程,其本质是将实例的原型,指向了构造函数的prototype属性,然后在实例上执行构造函数。
//构造函数
function Person(name) {
this.name = name;
}
// var p = new Person("zhenglijing");
//等同于将构造函数的原型对象赋给实例对象p的属性__proto__
p.__proto__ = Object.setPrototypeOf({},Person.prototype);
Person.call(p,"zhenglijing");
这样实例的属性__proto__就指向了构造函数的原型,这样就形成了原型链,当在实例中找不到属性或方法时,就通过原型链进行查找。
在实例中执行构造函数,构造函数就是一个普通函数,如果一个普通函数在一个对象中被执行了,那么this就是该实例。比如
var o = {};
function Person(name) {
this.name = name;
}
//把构造函数放在对象o中执行,那么这个this就是o对象了,执行完后,该o对象就有了实例属性name了。
Person.call(o,"zhenglijing");
#### getPropertyOf
Object.getPropertyOf(obj)是ES5中用来得到obj对象的原型对象的标准方法。
function User(name, passwordHash) {
this.name = name;
this.passwordHash = passwordHash;
}
User.prototype.toString = function() {
return "[User " + this.name + "]";
};
User.prototype.checkPassword = function(password) {
return hash(password) === this.passwordHash;
};
var u = new User("sfalken", "0ef33ae791068ec64b502d6cb0191387");
Object.getPrototypeOf(u) === User.prototype;
// true
Object.isExtensible(obj)
**Object.isExtensible()**
方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。
默认情况下,对象是可扩展的:即可以为他们添加新的属性。以及它们的 __proto__
属性可以被更改。Object.preventExtensions
方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。"),Object.seal
或 Object.freeze
方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。") 方法都可以标记一个对象为不可扩展(non-extensible)。
Object.isExtensible(1);
// false
var frozen = Object.freeze({});
Object.isExtensible(frozen); // === false
待续。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。