将函数原型设置为新对象

时间:2014-05-02 21:12:33

标签: javascript object prototype

我最近在代码中看到了这种模式:

 function Person(){
    this.name = "Dan";
}

Person.prototype = {
    whatAmI: function(){
        alert("I am a person")
    }
}

在上述对象 person 对象上,您只能通过调用 Person.prototype.whatAmI()而不是<来引用函数 whatAmI strong> Person.whatAmI()。

有没有特别的理由这样做? Tt似乎变得越来越流行,除了在原型对象上隐藏了methond而不是Person对象之外我无法看到好处。

我理解Javascript中的基础原型,并且我理解使用Person.prototype.whatAmI在仅仅调用new Person()的代码中有点不同寻常。但是,我在谈论Person对象从另一个函数调用返回的位置,并用作普通对象。因此,通过Person.prototype.whatAmI

调用whatAmI的唯一方法

4 个答案:

答案 0 :(得分:2)

函数的prototype属性的目的是确定在与该函数一起使用时通过new表达式创建的对象分配的原型,例如:

var p = new Person();

现在,p的基础原型是Person.prototype在评估new表达式时引用的对象,因此:

p.whoAmI();

作品。

通常,替换 prototype属性上的对象并不是一个好主意,您只应在设置继承层次结构时执行此操作。相反,只需添加到现有对象:

function Person(){
    this.name = "Dan";
}

Person.prototype.whoAmI = function(){
    alert("I am a person")
};

有点切,但是:

但是,在设置层次结构时,您必须替换该对象。

// Base
function Person(name) {
    this.name = name;
}
Person.prototype.whoAmI = function() {
    alert("I am " + this.name);
};

// Derived
function Employee(name, position) {
    Person.call(this, name);
    this.position = position;
}
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;

// Augmenting the derived prototype
Employee.prototype.whatDoIDo = function() {
    alert("I hold the position " + this.position);
};

(这不是最重要的,最终所有的等级制度,只是一个简单的例子。)

答案 1 :(得分:1)

whatmI应在Person 实例上调用,例如:

var bob = new Person();
bob.whatAmI();

构造函数的prototype属性具有可供该构造函数的所有构造实例访问的属性。

ECMAScript 5 specification对该语言基于原型的继承有一个令人愉快的可读解释:

  

每个构造函数都是一个具有名为“prototype”的属性的函数,用于实现基于原型的继承和共享属性。通过在新表达式中使用构造函数来创建对象;例如,new Date(2009,11)创建一个新的Date对象...

     

构造函数创建的每个对象都有一个隐式引用(称为对象的 prototype )到其构造函数的“prototype”属性的值。此外,原型可能具有对其原型的非零隐式引用,依此类推;这被称为原型链。当引用对象中的属性时,该引用是原型链中包含该名称属性的第一个对象中该名称的属性。换句话说,首先检查直接提到的对象的这种属性;如果该对象包含命名属性,那么该引用引用的属性;如果该对象不包含命名属性,则接下来检查该对象的原型;等等。

答案 2 :(得分:0)

Prototype实际上是JavaScript中用于完成继承的内置方式。已经定义的对象可以通过访问它的原型来添加方法和属性。

右转到主题的权威并阅读。这个主题特别是让JavaScript变得酷炫的原因。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

答案 3 :(得分:0)

没有具体原因。这取决于你想要什么。

如果Person类型的实例需要whatAmI函数,那么您可以在protoype上定义它。如果你想要它的类型,你可以,

Person.whatAmI = function(){
    alert("I am a person")
}

它们都是该语言的有效用途。你做什么取决于你的申请。