4、对象原型的操作
(1)Object.setPrototypeOf() ES6 IE11
设置对象的原型(即内部 [[Prototype]] 属性)
Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null
。
当调用该方法 的时候,如果对象的[[Prototype]]是不可扩展(通过 Object.isExtensible()
查看),就会抛出 TypeError
异常。如果prototype
参数不是一个对象或者null
(例如,数字,字符串,boolean,或者 undefined
),则什么都不做。否则,该方法将obj
的[[Prototype]]
修改为新的值。
Object.setPrototypeOf()是
ECMAScript 6最新草案中的方法,相对于 Object.prototype.__proto__
,它被认为是修改对象原型更合适的方法。
注意传参,源对象 原型对象。返回修改了原型后的源对象。
var obj1 = {
name: "obj1"
}
var obj = {
age: 24
}
var dict = Object.setPrototypeOf(obj, obj1);
console.log(dict.name); obj1
警告: 由于现代 JavaScript 引擎优化属性访问所带来的特性的关系,更改对象的 [[Prototype]]
在各个浏览器和 JavaScript 引擎上都是一个很慢的操作。其在更改继承的性能上的影响是微妙而又广泛的,这不仅仅限于 obj.__proto__ = ...
语句上的时间花费,而且可能会延伸到任何代码,那些可以访问任何[[Prototype]]
已被更改的对象的代码。如果你关心性能,你应该避免设置一个对象的 [[Prototype]]
。相反,你应该使用 Object.create()
来创建带有你想要的[[Prototype]]
的新对象。
(2)Object.getPrototypeOf() ES5 IE9
Object.getPrototypeOf()
方法返回指定对象的原型(内部[[Prototype]]
属性的值)。如果没有继承属性,则返回 null
。
var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto; // true
var reg = /a/;
Object.getPrototypeOf(reg) === RegExp.prototype; // true
(3)Object.create()
方法创建一个新对象并指定对象原型 兼容性:ES5 IE9
var obj = {
name: "zhu",
age: 24
}
var dict = Object.create(obj);
console.log(dict);