一樣重新定向了原型鏈,咋的結果不同?
let p={};
p.__proto__=Array.prototype;
p.slice; //? slice() { [native code] }。 結果正常咋的這樣就不行?
let o=Object.create(null);
o.__proto__=Array.prototype;
o.slice; //undefined.
uj5u.com熱心網友回復:
{}跟Object.create(null)創建出來的物件時不相同的。后者是沒有任何屬性的。uj5u.com熱心網友回復:
甚至都沒有[[prototype]]。。。uj5u.com熱心網友回復:
不對,應該是[[prototype]]是null。
uj5u.com熱心網友回復:
let o=Object.create(null);你指定了o的原型物件是null。你可以看成是o繼承了null。問題是null啥都沒有,沒有任何屬性和方法,原型鏈上都找不到任何東東的,所以o也如此。這其實也就是為什么你o.slice未定義的原因。因為你是真的沒給它定義。只是o.__proto__=Array.prototype;讓你產生錯覺,以為讓o繼承了Array,但其實,o.__proto__和你定義o.a,o.b,o.c沒有任何不同。只是你恰好給個屬性名稱就叫:__proto__
Object.create(null)是最最干凈的一個空物件,干凈到啥都沒有。就是一張白紙,你想畫啥畫啥。任何屬性和方法均由自己去定義,不用擔心覆寫原型鏈上的方法,因為它本身啥都沒有。夠自由奔放吧,它是干脆直接裸奔的
而
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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/275379.html
標籤:JavaScript
上一篇:請問 做的web頁面,多點擊下就卡住無法跳轉什么原因啊
下一篇:輸入框只能按順序輸入
