gpt4 book ai didi

Javascript原型(prototype)继承和对象创建

转载 作者:行者123 更新时间:2023-11-30 17:15:49 24 4
gpt4 key购买 nike

我无法理解普通对象和继承创建过程与整个 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";
  1. greetprotoGreet 方法有什么区别。他们的行为完全相同。
  2. alexjohn 有什么区别。一个是使用 new 关键字创建的,另一个是通过 Person“类”的 prototype 属性创建的。
  3. 我想没有正确的方法,因为两者都是正确的,但是什么时候我应该更喜欢一种方法呢?

最佳答案

原型(prototype)函数和对象自身函数的区别:
问候功能:此功能(所有功能都是对象)在实例对象内部,因此每个实例都有自己的问候功能,如图所示。

protoGreet 函数:位于内存中的一个独立对象(图片中的文字对象)内,不属于 Person 的任何实例。但是 Person 的每个实例都有一个指向该对象的隐藏链接(引用)(此链接称为 __proto__)。所以这个对象在 Person

的所有实例之间共享

enter image description here

What do I care how many instances of greet are there?

内存优化是所有应用程序的本质,实际上网络应用程序也不异常(exception)。因此,当单个共享对象足以满足您的目的时,为每个实例使用单独的对象可能会违反此规则。但是从性能的 Angular 来看,第一种方式(即 greet 函数)可能比第二种方式(即 protoGreet 函数)更快,因为不会发生称为原型(prototype)链查找的特定过程。请记住,在这种权衡中,内存是赢家。

对于您的其他问题,您似乎不知道 new 关键字到底做了什么。因此,让我指出一个旁注。

注意:这些步骤将在您使用 new 关键字调用函数时完成。假设我们有以下函数:

function Person (name, age) {
this.name = name;
this.age = age;
}
  • 创建一个空文字对象,即 {}(请注意,此对象的隐藏 __proto__ 链接指的是 Person.prototype 所代表的对象)
  • 调用该函数并将所有 this 关键字替换为 this emply literal object(用更专业的术语来说,this 指的是那个空的 literal 对象)。
  • 指定的属性和方法将添加到新创建的对象中。 (在本例中为 nameage 属性)。
  • 最后,该对象将从函数中隐式返回。

现在让我们回到您的问题,Object.create(Person.prototype)new Person() 之间有什么区别?

Case new Person() 前面已经讨论过了。但是 Object.create(Person.prototype) 创建一个空对象并将其 __proto__ 链接到第一个输入参数对象(在本例中为 Person.prototype)并返回新创建的对象对象作为输出。

好的,到目前为止,我希望这篇笔记能澄清您的问题,但如果我的回答仍然没有意义,请告诉我您的问题出在哪里。

关于Javascript原型(prototype)继承和对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26147293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com