我写了从 Person
继承 reader
的简短代码:
<script>
/* Class Person. */
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
}
var reader = new Person('John Smith');
alert(reader.getName());
</script>
或者我可以删除 Person.prototype.getName = function() { return this.name; 行}
并在 Person 对象中创建它。例如
<script>
/* Class Person. */
function Person(name) {
this.name = name;
this.getName = function() { return this.name;}
}
var reader = new Person('John Smith');
alert(reader.getName());
</script>
在这两种情况下调用 getName()
时我得到了相同的结果。那么它们有何不同?
最佳答案
当您在原型(prototype)上放置一些东西时,对象的每个实例都共享相同方法代码。它们都使用相同的函数实例。
当您简单地将一个方法放在 this
上时,每个对象实例都有其自己的相同方法的副本。
使用 prototype
效率更高。请注意,这就是为什么通常将方法放在原型(prototype)上的原因,因为您通常希望所有实例都使用相同的方法,但将属性放在实例本身上,因为通常您不希望所有实例共享相同的属性。
对于您的评论,如果您将一个方法放在一个对象的构造函数上,那么您实际上已经创建了一个“静态”方法。对象的任何实例都不会有该方法,它们都必须在构造函数上访问它。所以在你的例子中,Person.someMethod()
。
关于javascript - javascript中原型(prototype)的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11541436/