我无法理解普通对象和继承创建过程与整个概念之间的差异。比方说,我有这样的代码:Javascript原型继承和对象创建
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'函数,它在所有实例之间共享。 – 2014-10-01 17:43:22
通常,在原型和属性以及构造函数中的受保护方法上编写泛型方法是很方便的。如果所有对象都需要它,请使用proto,如果只有一些做,则在构造函数中进行。 – dandavis 2014-10-01 17:44:06
'Object.create(Person)'应该是'Object.create(Person.prototype)',然后区别在于'Person'构造函数中所做的工作都不会应用到'john'对象,除非你做'Person.call(john,“John”,20,“mars”)' – 2014-10-01 17:44:48