请澄清这两个代码的差异
function Person(gender) {
this.gender = gender;
alert('Person instantiated');
}
Person.prototype.sayHello = function()
{
alert ('hello');
};
var person1 = new Person('Male');
var person2 = new Person('Female');
// call the Person sayHello method.
person1.sayHello()
,第二个是函数在函数内定义的函数(没有原型属性)
function Animal(gender) {
this.gender = gender;
alert('animal instantiated');
this.sayToodle = function()
{
alert ('GOOOOOOO!!');
};
}
var Animal1 = new Animal('Male');
var Animal2 = new Animal('Female');
Animal1.sayToodle();
my more simple question are:
我们不能定义其函数的obj out方法(CLASS)???
答案 0 :(得分:3)
在构造函数中定义一个成员(例如:this.name
)只给出该对象的该实例访问该成员。
在原型中定义成员允许所有实例“共享”该属性。
一种帮助我理解这一点的方法是在原型中定义一个数组(或任何其他不是方法的成员),如下所示:
function Animal() {}
Animal.prototype = {
kids: [],
giveBirth: function() {
for(var i = 0; i < arguments.length; i++) {
this.kids.push(arguments[0]);
}
}
}
var cat = new Animal();
var giraffe = new Animal();
cat.giveBirth('kitten','another kitten','yet another kitten');
// cat.kids === ['kitten','another kitten','yet another kitten'];
// giraffe.kids === ['kitten','another kitten','yet another kitten'];
如果你注意到,长颈鹿的孩子们就像小猫一样。为什么是这样?因为在这种情况下,.giveBirth()
会访问原型的 kids
数组,该数组由所有实例共享。
如果我们不想分享会员,因为会员是独一无二的,该怎么办?你可以这样做:
function Animal() {
this.kids = [];
}
Animal.prototype = {
giveBirth: function() {
for(var i = 0; i < arguments.length; i++) {
this.kids.push(arguments[0]);
}
}
}
var cat = new Animal();
var giraffe = new Animal();
cat.giveBirth('kitten');
// cat.kids === ['kitten']
// giraffe.kids == undefined
giraffe.giveBirth('baby giraffe');
// cat.kids === ['kitten']
// giraffe.kids === ['baby giraffe']
正如您在评论中指出的那样,您决定如何定义属性的部分内容会影响内存使用情况;另一部分将介绍您希望在所有实例中“共享”的成员。
要更深入地了解原型(通过了解new
如何工作),请参阅StackOverflow上的What is the 'new' keyword in JavaScript?。
以下是引用:
经过大量的搜索,我终于找到了确切的内容 新关键字确实如此,它有4件事:
- 它会创建一个新对象。这个对象的类型就是对象。
- 它将此新对象的内部,不可访问,[[prototype]]属性设置为构造函数的外部,可访问, 原型对象。
- 执行构造函数,只要提到这个就使用新创建的对象。
- 它返回新创建的对象,除非构造函数返回非原始值。在这种情况下,那 将返回非原始值。
醇>
答案 1 :(得分:0)
原型成员在实例之间共享,定义为this.something
的构造函数中的成员是特定于实例的。
当实例需要特定于实例的成员(如Person.name)时,将其定义为this.name
。当它可以共享时(如方法sayName)在原型上定义它,如:Person.prototype.sayName=function(){...
有关原型和构造函数的更多信息,您可以查看this answer。