ES6 操作 prototype 的方法
原始修改原型的方式缺点
- 语义化,内部属性
- 访问效率慢
- 所有继承自该原型的对象都会影响到
Object.getPrototypeOf()方法,获取原型
Object.setPrototypeOf(被设置原型的对象, 新原型对象)方法,设置原型
返回值为 被设置原型的对象
var obj = {
name: "xiaoming",
};
var obj2 = {
name: "xiaohong",
};
var o = Object.setPrototypeOf(obj, obj2);
console.log(o);
console.log(o === obj); // true
当 第二个参数 为 null 时,将对象的原型设置为 null
当 第一个参数 是原始数据类型时,Object.setPrototypeOf()干了些什么?
- 首先将原始值类型包装成对象的形式
- 然后通过获取原型的方式进行获取原型
- 总结为:如果当前 第一个参数 不是对象,setPrototypeOf 尝试利用相应的包装类进行包装成对象的形式,然后默认设置新的原型失败,返回原始值
let obj = Object.setPrototypeOf(1, {
a: 1, b: 2 });
console.log(obj); // 1
console.log(Object.getPrototypeOf(obj) === Number.prototype); // true
console.log(Object.getPrototypeOf(1) === Number.prototype); // true
console.log(Object.getPrototypeOf(1)); // Number包装类对象
三大包装类设置指定原型默认失败
let obj = Object.setPrototypeOf("foo", {
a: 1, b: 2 }); // String包装类对象
let obj = Object.setPrototypeOf(1, {
a: 1, b: 2 }); // Number包装类对象
let obj = Object.setPrototypeOf(true, {
a: 1, b: 2 }); // Boolean包装类对象
console.log(Object.getPrototypeOf(obj));
undefined、null 设置原型失败 Uncaught TypeError: Object.setPrototypeOf called on null or undefined
let obj = Object.setPrototypeOf(undefined, {
a: 1, b: 2 });
let obj = Object.setPrototypeOf(null, {
a: 1, b: 2 });
console.log(obj); // TypeError: Object.setPrototypeOf called on null or undef