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