我无法理解普通对象和继承创建过程与整个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";



greetprotoGreet方法之间的区别是什么?它们的行为完全相同。
alexjohn有什么区别。一个是使用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表示该空文字对象)。
指定的属性和方法将添加到该新创建的对象中。 (在这种情况下,nameage属性)。
最后,该对象将隐式地从函数中返回。


现在让我们回到您的问题,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/

10-12 18:17