Javascript原型

2018-01-06 19:14 更新

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 

上面的代码生成以下结果。

上面的代码生成以下结果。...



[[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]" 

上面的代码生成以下结果。

我们不能为一个实例的prototype属性赋值。

将值分配给toString会在实例上创建一个新的属性,使原型上的属性保持不变。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号