javascript原型逻辑

javascript原型逻辑,javascript,Javascript,我正在阅读,他们展示了以下内容: 此代码适用于: var friend = new Person(); Person.prototype.sayHi = function(){ alert("hi"); }; friend.sayHi(); 但该代码不: function Person(){ } var friend = new Person(); Person.prototype= { constructor: Person, name: "Nicholas",

我正在阅读,他们展示了以下内容:

此代码适用于:

var friend = new Person();

Person.prototype.sayHi = function(){
    alert("hi");
};

friend.sayHi();
但该代码不:

function Person(){
}

var friend = new Person();

Person.prototype= {
   constructor: Person,
   name: "Nicholas",
   age: 29,
   job: "Software Engineer",
   sayName: function () {
       alert(this.name);
   }
};

friend.sayName();

我明白了,在第二个示例中,原型是在
friend
变量实例化之后定义的,但是在这种情况下,第一个示例为什么工作?

在第一个代码片段中,您将添加到已经提供给实例的现有原型中。在第二个示例中,您正在为
Person
创建一个新的原型,它不同于已经提供给
friend
的原型对象


如果要向原型中添加新函数,则可以在调用该函数之前的任何时间执行此操作。在实例化新实例之前,需要将新对象分配给构造函数的原型。

在第一个代码段中,您将添加到已提供给实例的现有原型中。在第二个示例中,您正在为
Person
创建一个新的原型,它不同于已经提供给
friend
的原型对象


如果要向原型中添加新函数,则可以在调用该函数之前的任何时间执行此操作。在实例化新实例之前,需要为构造函数的原型分配一个新对象。

我不是这方面的专家-但是允许您完全覆盖
属性
对象吗?我认为您应该在对象声明中创建所需的变量,然后使用
Person.prototype.sayName=function(){}
。我认为,
prototype
还包含各种其他与对象相关的内容,您可以在第二个示例中通过完全覆盖来删除这些内容。在第一个示例中,您将向原型添加一个属性,在第二个示例中,您将覆盖整个原型。这些案例根本不具有可比性。将它们更改为相似的,您将得到相同的行为我不是这方面的专家-但是您是否可以完全覆盖
属性
对象?我认为您应该在对象声明中创建所需的变量,然后使用
Person.prototype.sayName=function(){}
。我认为,
prototype
还包含各种其他与对象相关的内容,您可以在第二个示例中通过完全覆盖来删除这些内容。在第一个示例中,您将向原型添加一个属性,在第二个示例中,您将覆盖整个原型。这些案例根本不具有可比性。将它们更改为相似,您将得到相同的行为附加问题:如果原型尚未在第一个示例中定义,它是否不再工作?当您声明函数时,将构造默认原型。附加问题:如果原型尚未在第一个示例中定义,它不再工作了吗?当您声明函数时,会构造一个默认原型。