鍍金池/ 問答/HTML5  HTML/ js不是隨便一個(gè)對(duì)象就可以使用prototype嗎?

js不是隨便一個(gè)對(duì)象就可以使用prototype嗎?

比如
var a = [1,2,3];
a.prototype.b = function(){console.log(this)};
a.b();
這樣寫為什么是錯(cuò)的呢?

回答
編輯回答
櫻花霓

prototype是構(gòu)造函數(shù)的屬性,它指向另一個(gè)對(duì)象。這個(gè)對(duì)象的所有屬性和方法,都會(huì)被構(gòu)造函數(shù)的實(shí)例繼承。

你這里的a是實(shí)例而不是構(gòu)造函數(shù),要搞清楚面向?qū)ο筮@幾個(gè)概念,看一下正確的寫法,或許你就明白了

Array.prototype.b = function(){ console.log(this) }
var a = new Array(1,2,3) //或 var a = [1,2,3]
a.b() // [1,2,3]

建議看一下面向?qū)ο蟮南嚓P(guān)知識(shí)

2017年11月10日 02:06
編輯回答
陪妳哭

函數(shù)(正常來說是構(gòu)造函數(shù))才有prototype

2018年1月9日 06:25
編輯回答
茍活

因?yàn)?code>var a = []; == var a = new Array;

2018年7月7日 13:57
編輯回答
撿肥皂

這個(gè)問題很有意思,不過首先要明確prototype到底是指什么。

  • 如果是指“原型”,則題目變?yōu)椤懊總€(gè)對(duì)象都有原型,并且可以任意修改”這句話對(duì)嗎?,
  • 但如果只是指“prototype這個(gè)屬性”,即a.prototype存在嗎,這是全部的答案在回答的。

如果題主是對(duì)第一種情況感興趣,可以繼續(xù)看下去。

每個(gè)對(duì)象都有原型嗎?

每個(gè)對(duì)象都有原型,這句話對(duì),也不對(duì),Object.create(null)得到的對(duì)象沒有原型,這一般是用來實(shí)現(xiàn)一個(gè)“純凈”的容器。

大部分情況下每個(gè)對(duì)象都有原型,當(dāng)獲取對(duì)象上的屬性時(shí),如果該對(duì)象上沒有,就會(huì)去原型上尋找,這就是a.push(2)可以執(zhí)行的原因,a沒有push方法,但a的原型上有。

可以任意修改原型嗎?

既然a是有原型的,那可以修改嗎,可以的。如果是在chrome控制臺(tái)可以簡單實(shí)驗(yàn)下:

const a = [1, 2, 3];
a.__proto__.b = function () {console.log('b function ', this)};
a.b();

__proto__不是規(guī)范的,所以需要用Object.getPrototypeOf()拿到后再修改。

const ary = [1, 2, 3];
const aryPrototype = Object.getPrototypeOf(ary);
aryPrototype.b = function () {console.log('b function ', this)};
ary.b();
2017年7月13日 18:47
編輯回答
尐懶貓
Array.prototype.b = function(){console.log(this)};

這樣應(yīng)該就可以了,因?yàn)?a作為 Array原型的實(shí)例。
如果要訪問某對(duì)象a的原型,需要這樣寫

Object.getPrototypeOf(a)

或者

a.constructor.prototype 

如果a是構(gòu)造函數(shù),可以直接通過a.prototype訪問,上面就是先調(diào)出a的構(gòu)造函數(shù)

2018年8月9日 09:00
編輯回答
我以為
var a = [1, 2, 3];
Array.prototype.b = function(i) {
  alert(this[i]);
};
a.b(a.length - 1);
2017年7月3日 07:40