87,901
社区成员
发帖
与我相关
我的任务
分享
let p={};
p.__proto__=Array.prototype;
p.slice; //ƒ slice() { [native code] }。 结果正常
let o=Object.create(null);
o.__proto__=Array.prototype;
o.slice; //undefined.
let p={};
相当于下面的,继承了object
let p=Object.create(Object.prototype)
let o = Object.create(null)
o.__proto__ = Array.prototype
const arr1 = new o.__proto__.constructor()
console.log(o.__proto__ === [].__proto__) //=> true
console.log(o.__proto__.constructor === [].__proto__.constructor) //=> true
console.log(arr1.__proto__.constructor === [].__proto__.constructor) //=> true
console.log(o.__proto__.slice === [].__proto__.slice) //=> true
arr1.push(1)
console.log(arr1) //=> [1]
//如果上面的让你产生了错觉。认为o继承了Array
//下面就是反证:只是你恰好给o添加了一个属性名称叫:__proto__
//这就是为什么你o.slice报未定义的原因,因为o原本是啥属性和方法都没有的,你并没有给它定义slice方法,所以它未定义
let o1 = Object.create(null)
o1.prop = Array.prototype
const arr2 = new o1.prop.constructor()
console.log(o1.prop === [].__proto__) //=> true
console.log(o1.prop.constructor === [].__proto__.constructor) //=> true
console.log(arr2.__proto__.constructor === [].__proto__.constructor) //=> true
console.log(o1.prop.slice === [].__proto__.slice) //=> true
arr2.push(1)
console.log(arr2) //=> [1]