我最近在代码中看到了这种模式:
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
答案 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")
}
它们都是该语言的有效用途。你做什么取决于你的申请。