【发布时间】:2014-11-26 15:26:42
【问题描述】:
我无法理解普通对象和继承创建过程与整个prototype 概念之间的区别。假设我有这个代码:
function Person(name, age,location){
this.name = name;
this.age = age;
this.location = location;
this.greet = function(){
return console.log(this.name + " says hi from "+this.location);
}
}
Person.prototype = {
protoGreet: function(){
console.log(this.name + " says 'that greeting was sent using a prototype'")
}
}
var alex = new Person("Alex",29,"earth");
var john = Object.create(Person);
//now I can set john's location john.location = "wherever";
-
greet和protoGreet方法有什么区别。它们的行为完全相同。 -
alex和john有什么区别。一个是使用new关键字创建的,另一个是通过Person"class" 的prototype属性创建的。 - 我想没有正确的方法,因为两者都是正确的,但是我什么时候应该更喜欢一种方法而不是另一种方法?
【问题讨论】:
-
为每个
Person实例创建一个greet函数,而只有一个protoGreet函数,在所有实例之间共享。 -
一般来说,在原型和属性以及构造函数中的受保护方法上编写泛型方法很方便。如果所有对象都需要它,请使用 proto,如果只有一些需要,请在构造函数中进行。
-
Object.create(Person)应该是Object.create(Person.prototype),然后不同的是Person构造函数中所做的任何工作都不会应用于john对象,除非你这样做@987654337 @ -
1.我在乎有多少
greet实例?表现? 2. 某个方法只有一个共享>实例有什么好处? 3. 在什么情况下我不需要/不想/不得不使用原始构造函数? 4. 如果我使用Object.create(Person.prototype)创建一个对象,那么神奇之处在哪里?在Object的构造函数中?
标签: javascript inheritance prototype javascript-objects