我无法理解普通对象和继承创建过程与整个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
关键字创建的,另一个是通过prototype
“ class”的Person
属性创建的。我猜没有正确的方法,因为这两种方法都是正确的,但是我什么时候应该偏爱一种方法呢?
最佳答案
原型函数和对象本身函数之间的区别:
greet函数:该函数(所有函数都是对象)位于实例对象的内部,因此每个实例都有其自己的greet函数,如图所示。
protoGreet函数:位于内存中的独立对象(图片中的文字对象)内部,并且不属于任何Person
实例。但是Person
的每个实例都有一个指向该对象的隐藏链接(引用)(此链接称为__proto__)。因此,该对象在Person
的所有实例之间共享
我在乎多少个问候实例?
内存优化是所有应用程序的本质,实际上Web应用程序也不例外。因此,当单个共享对象足以满足您的目的时,为每个实例使用单独的对象可能会违反此规则。但是从性能角度来看,第一种方法(即greet函数)可以比第二种方法(即protoGreet函数)更快,因为没有发生称为原型链查找的特定过程。请记住,在这种折衷的记忆中是赢家。
对于您的其他问题,似乎您不知道new
关键字到底能完成什么。因此,让我指出一个注意事项。
注意:使用new
关键字调用函数时,将完成这些步骤。假设我们具有以下功能:
function Person (name, age) {
this.name = name;
this.age = age;
}
创建一个空的文字对象,即
{}
(请注意,此对象的隐藏__proto__链接引用了Person.prototype
表示的对象)调用该函数并用此emply文字对象替换所有
this
关键字(更确切地说,this
表示该空文字对象)。指定的属性和方法将添加到该新创建的对象中。 (在这种情况下,
name
和age
属性)。最后,该对象将隐式地从函数中返回。
现在让我们回到您的问题,
Object.create(Person.prototype)
和new Person()
有什么区别?案例
new Person()
在前面已经讨论过。但是Object.create(Person.prototype)
创建一个空对象,并将其__proto__链接到第一个输入自变量对象(在本例中为Person.prototype
),并将该新创建的对象作为输出返回。好的,到目前为止,我希望此注释可以澄清您的问题,但是,如果我的回答仍然没有意义,请告诉我您的问题出在哪里。
关于javascript - Javascript原型(prototype)继承和对象创建,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26147293/