Javascript 使用.prototype向变量添加方法

Javascript 使用.prototype向变量添加方法,javascript,Javascript,我想分析这段代码,但遇到了一些问题。我的麻烦是从这一行开始的Customer.prototype=新人()。现在据我所知。我们可以像使用Person.prototype.getName一样,向变量添加一些方法。很好,现在Person有一个proto指向一个返回名称的函数。那么,当我们做Customer.prototype=newperson()时,这意味着什么。这是否意味着将Person中的所有方法和语句放入变量Customer中 var Person = function(name) {

我想分析这段代码,但遇到了一些问题。我的麻烦是从这一行开始的<代码>Customer.prototype=新人()。现在据我所知。我们可以像使用
Person.prototype.getName
一样,向变量添加一些方法。很好,现在
Person
有一个
proto
指向一个返回名称的函数。那么,当我们做
Customer.prototype=newperson()时,这意味着什么。这是否意味着将
Person
中的所有方法和语句放入变量
Customer

var Person = function(name) {
  this.name = name;
};

Person.prototype.getName = function() {
  return this.name;
};


var john = new Person("John");

//Try the getter
alert(john.getName());


Person.prototype.sayMyName = function() {
  alert('Hello, my name is ' + this.getName());
};

john.sayMyName();

var Customer = function(name) {
    this.name = name;
};


Customer.prototype = new Person();     


var myCustomer = new Customer('Dream Inc.');
myCustomer.sayMyName();


Customer.prototype.setAmountDue = function(amountDue) {
    this.amountDue = amountDue;
};
Customer.prototype.getAmountDue = function() {
    return this.amountDue;
};


myCustomer.setAmountDue(2000);
alert(myCustomer.getAmountDue());

通过执行
Customer.prototype=newperson()
我们实际上是在用另一种语言进行类继承。那么,假设我们有:

var p = new Person();
Customer.prototype = p;
var c = new Customer();
c
的原型是
p
p
的原型是Person.prototype

执行继承的简单方法是
Customer.prototype=Person.prototype
,这将使Customer的所有实例与Person共享相同的方法。但是,如果我们做了
Customer.prototype.newMethod=…
,它也会修改
Person.prototype的原型(因为它们是相同的对象)

为了区分客户原型和个人原型,我们使用
newperson()
作为链中的中间环节,该链仍然与个人原型有链接,但是一个单独的对象


注意:通常更常规的做法是执行
Customer.prototype=Object.create(Person)
然后执行
Customer.prototype.constructor=Customer;
,因为执行
new Person()
意味着调用
Person
的构造函数(这通常是不需要的,除非你真的在制作一个真实的对象)。

通过执行
Customer.prototype=new Person()
我们实际上是在用另一种语言进行类继承。因此,假设我们有:

var p = new Person();
Customer.prototype = p;
var c = new Customer();
c
的原型是
p
p
的原型是Person.prototype

执行继承的简单方法是
Customer.prototype=Person.prototype
,这将使客户的所有实例与Person共享相同的方法。但是,如果我们执行
Customer.prototype.newMethod=…
,它还将修改
Person.prototype
的原型(因为它们是相同的对象)

为了区分客户原型和个人原型,我们使用
newperson()
作为链中的中间环节,该链仍然与个人原型有链接,但是一个单独的对象


注意:通常更常规的做法是执行
Customer.prototype=Object.create(Person)
然后执行
Customer.prototype.constructor=Customer;
,因为执行
new Person()
意味着调用
Person
的构造函数(除非你真的在制作一个真实的物体,否则通常是不需要的)。

每个物体都有一个原型,这也是一个物体

当你这样做的时候

Customer.prototype = new Person();
…您可以设置
客户
的原型对象。方法和属性不会被复制到
客户
对象中,但是当您在
客户
上引用属性/方法时,原型链将被跟踪以查找该属性/方法

myCustomer.sayMyName
的情况下,JavaScript引擎首先查找
myCustomer
拥有的属性,然后查找其原型(即
Person
对象),最后查找
Person
的原型(即具有该方法的对象):

Person.prototype.sayMyName = function() {
  alert('Hello, my name is ' + this.getName());
};

每个对象都有一个原型,它也是一个对象

当你这样做的时候

Customer.prototype = new Person();
…您可以设置
客户
的原型对象。方法和属性不会被复制到
客户
对象中,但是当您在
客户
上引用属性/方法时,原型链将被跟踪以查找该属性/方法

myCustomer.sayMyName
的情况下,JavaScript引擎首先查找
myCustomer
拥有的属性,然后查找其原型(即
Person
对象),最后查找
Person
的原型(即具有该方法的对象):

Person.prototype.sayMyName = function() {
  alert('Hello, my name is ' + this.getName());
};

在OOP tems中,这意味着客户从PersonDon继承而来,不必花太多心思,在OOP tems中,这意味着客户从PersonDon继承而来,不必花太多心思,你的确切意思是什么,他们不被复制,而是被引用属性?这是否意味着客户可以使用人在其中拥有的一切,但这与实际的VA不同客户的价值正在改变?你对价值的理解是什么?客户唯一改变的是它的原型(它的
\uuuuu proto\uuuu
属性)。其余的都由JavaScript引擎管理,它实现了原型链继承。是的,Person公开的属性对客户是可用的,除非客户有自己的实现。我明白了。所以Person公开的属性对客户是可用的,但反过来肯定不是真的?确实,正如您所说.酷。说真的,这些东西看起来太冗长了,每个文档似乎都用这种垃圾词来解释这一点。谢谢。你的确切意思是什么?他们不会被复制,而是参考属性?这是否意味着客户可以使用他们所有的东西,但这不像客户的实际价值正在被改变?你是什么意思有价值?客户唯一改变的是它的原型(它的
\uuuuu proto\uuuu
属性)。其余的都由JavaScript引擎管理,它实现了原型链继承。是的,Person公开的属性对客户是可用的,除非客户有自己的实现。我明白了。所以Person公开的属性对客户是可用的,但相反的是