我无法理解普通对象和继承创建过程与整个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
"类" {/ li>的Person
属性创建的。答案 0 :(得分:2)
原型功能和对象本身功能之间的区别:
greet函数:此函数(所有函数都是对象)位于实例对象内部,因此每个实例都有自己的greet函数,如图所示。
protoGreet函数:位于内存中的独立对象(图片中的文字对象)内,并不归Person
的任何实例所有。但是Person
的每个实例都有一个隐藏的链接(引用)到该对象(此链接称为__proto__)。因此,此对象在Person
我在乎有多少个问候实例?
内存优化是所有应用程序的本质,实际上Web应用程序没有例外。因此,当单个共享对象足以满足您的需要时,为每个实例使用单独的对象可能违反此规则。但是作为性能观点,第一种方式(即问候函数)可以比第二种方式(即protoGreet函数)更快,因为不会发生称为原型链查找的某个过程。请记住,在这种权衡记忆中是赢家。
对于您的其他问题,似乎您不知道new
关键字到底做了什么。所以,让我指出你的旁注。
注意:当您使用new
关键字调用函数时,将执行这些步骤。假设我们有以下功能:
function Person (name, age) {
this.name = name;
this.age = age;
}
{}
(请注意,此对象的隐藏__proto__链接指的是Person.prototype
所代表的对象)this
个关键字替换为此emply文字对象(在更多技术词汇中,this
引用该空文字对象)。name
和age
属性)。现在让我们回到你的问题,Object.create(Person.prototype)
和new Person()
之间有什么区别?
案例new Person()
已在上文讨论过。但Object.create(Person.prototype)
创建一个空对象并将其__proto__链接到第一个输入参数对象(在本例中为Person.prototype
)并将该新创建的对象作为输出返回。
好的,到目前为止,我希望此笔记能够澄清您的问题,但如果我的答案仍然没有意义,请告诉我您的问题在哪里。