Javascript原型
Javascript面向对象设计 - Javascript原型
当使用构造函数创建对象时,每个实例都有自己的writeLine()方法。
如果我们有100个实例的书,有writeLine方法的100个副本。
我们可以使用原型只有一个方法的副本。
该原型在所有对象实例之间共享,并且这些实例可以访问属性的原型。
我们可以通过使用以下函数来确定属性是否在原型上:
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
上面的代码生成以下结果。
![](https://atts.w3cschool.cn/attachments/jimg/javascript_object_oriented/DESCRIPTION__639F11D3D4641068C894.png)
上面的代码生成以下结果。...
[[Prototype]]属性
实例通过内部属性跟踪其原型称为[[原型]]。
实例通过内部属性跟踪其原型称为[[原型]]。...
我们可以通过使用来读取[[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引擎搜索具有该名称的自己的属性。
如果引擎找到一个正确命名的属性,它返回该值。
如果没有自己的财产name存在于目标对象上,JavaScript搜索[[Prototype]]对象。
如果存在具有该名称的原型属性,则值的属性返回。
如果搜索结束而没有找到属性具有正确的名称,返回undefined。
注意
请考虑以下情况,其中首先创建一个对象,但不具有任何自己的属性:
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]"
上面的代码生成以下结果。
![](https://atts.w3cschool.cn/attachments/jimg/javascript_object_oriented/NOTE__AD0034C8C42F1120BF2D.png)
我们不能为一个实例的prototype属性赋值。
将值分配给toString会在实例上创建一个新的属性,使原型上的属性保持不变。
更多建议: