函数调用的以下两个用法之间有什么区别:algis.add()
vs Person.prototype.add2(algis)
?
function Person(first, last) {
this.firstName = first;
this.lastName = last;
}
Person.prototype.add = function (){
return this.lastName + this.firstName;
}
Person.prototype.add2= function (person){
return person.lastName + person.firstName;
}
var algis = new Person ('algis', 'sru');
alert('add = ' + algis.add()); //works
alert('add2 = ' + Person.prototype.add2(algis)); //works
是否有使用algis.add()
vs Person.prototype.add2(algis)
?
答案 0 :(得分:-1)
两种方法的区别可以分析如下:
方法1 algis.add()
正在使用algis原型中的一个函数(更确切地说,在Object类型 Person 的原型中)来连接先前存储在algis中的两个值。
方法2 Person.prototype.add2(algis)
要求对象类型人的原型添加存储在algis对象中的变量。
对于方法1,javascript解释器将首先检查对象类型 Person 是否具有函数add()
。如果它没有(这是你的情况),那么根据原型继承,javascript解释器将查看algis的原型来搜索函数add()
和原型的原型等等,直到它到达最终原型 Function.prototype
重要提示:
即使您没有询问,最好将功能对象人员中的变量声明为公共,受保护或私有< / strong>即可。这很重要,原因如下:
{...}
内的任何内容由于这被认为是发生错误的一个容易的地方,因此建议始终在块的顶部声明您正在使用的变量,以便您的代码更易于阅读和调试。并且因为保持一致性很重要这也应该是函数中的常见做法,即使存在闭包。因此,在您的情况下,我会在代码protected firstname; protected lastname;
之前放置this.firstname = ...
。
答案 1 :(得分:-2)
第一个例子:
var algis = new Person ('algis', 'sru');
alert( 'add = ' + algis.add() ); //works
这是使用Person构造函数创建Object的新实例。
然后你调用add函数方法,该方法已添加了Person原型。
第二个例子:
alert ('add2 = ' + Person.prototype.add2(algis) ); //works
这是在Person原型上调用add2函数并将algis作为参数传递。
额外:
如果您不清楚原型继承在Javascript中的工作原理(为什么要获得输出),可以参考以下链接:Link
答案 2 :(得分:-2)
使用以下两个add
函数之间没有太大区别。
function PersonAdd(person){
return person.lastName + person.firstName;
}
Person.prototype.add= function (person){
return person.lastName + person.firstName;
}
换句话说。如果你经历过&#34;麻烦&#34;创建一个原型方法我没有看到将它作为一个函数在其上下文之外调用并且必须将上下文作为变量传递。
从我的观点来看,你忽略了封装原则,这是OO的优势之一。我会一直采用你的第一种方法。
Person.prototype.add = function (){
return this.lastName + this.firstName;
}
var algis = new Person ('algis', 'sru');
alert( 'add = ' + algis.add() );