當使用構(gòu)造函數(shù)創(chuàng)建對象時,每個實例都有自己的writeLine()方法。
如果我們有100個實例的書,有writeLine方法的100個副本。
我們可以使用原型只有一個方法的副本。
該原型在所有對象實例之間共享,并且這些實例可以訪問屬性的原型。
我們可以通過使用以下函數(shù)來確定屬性是否在原型上:
function Book(name) { /*from w w w . j a v a 2 s . co m*/
this.name = name;
this.writeLine = function() {
console.log(this.name);
};
}
var book = new Book("Javascript");
function hasPrototypeProperty(object, name) {
return name in object && !object.hasOwnProperty(name);
}
console.log(hasPrototypeProperty(book, "name")); // false
console.log(hasPrototypeProperty(book, "hasOwnProperty")); // true
上面的代碼生成以下結(jié)果。
上面的代碼生成以下結(jié)果。...
實例通過內(nèi)部屬性跟蹤其原型稱為[[原型]]。
實例通過內(nèi)部屬性跟蹤其原型稱為[[原型]]。...
我們可以通過使用來讀取[[Prototype]]屬性的值Object.getPrototypeOf()方法。
我們可以通過使用來讀取[[Prototype]]屬性的值Object.getPrototypeOf()方法。...
var object = {};
var prototype = Object.getPrototypeOf(object);
console.log(prototype === Object.prototype); // true
我們還可以測試看一個對象是否是另一個對象的原型使用isPrototypeOf()方法,它包含在所有對象上:
var object = {};
console.log(Object.prototype.isPrototypeOf(object)); // true
當對一個對象讀取屬性時,首先是JavaScript引擎搜索具有該名稱的自己的屬性。
如果引擎找到一個正確命名的屬性,它返回該值。
如果沒有自己的財產(chǎn)name存在于目標對象上,JavaScript搜索[[Prototype]]對象。
如果存在具有該名稱的原型屬性,則值的屬性返回。
如果搜索結(jié)束而沒有找到屬性具有正確的名稱,返回undefined。
請考慮以下情況,其中首先創(chuàng)建一個對象,但不具有任何自己的屬性:
var object = {};
/*from www. j av a2 s . c o m*/
console.log(object.toString()); // "[object Object]"
object.toString = function() {
return "[object Custom]";
};
console.log(object.toString()); // "[object Custom]"
// delete own property
delete object.toString;
console.log(object.toString()); // "[object Object]"
// no effect - delete only works on own properties
delete object.toString;
console.log(object.toString()); // "[object Object]"
上面的代碼生成以下結(jié)果。
我們不能為一個實例的prototype屬性賦值。
將值分配給toString會在實例上創(chuàng)建一個新的屬性,使原型上的屬性保持不變。
更多建議: