1

在这里,我试图了解javascript中的一些继承概念。我创建了person类并尝试在Customer类中继承它。

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

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

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


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

        Customer.prototype = new Person();


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

每次创建新对象时,javascript引擎基本上都会调用原型的构造函数。在这里,我试图了解几件事:

如果客户原型是指个人对象。因此,新客户对象的创建应该只包含个人属性/方法而不是客户属性/方法。客户属性如何附加到新客户对象(myCustomer)?

我在这里错过了一些 javascript 概念吗?

4

4 回答 4

1

在这里,我试图了解javascript中的一些继承概念。我创建了person类并尝试在Customer类中继承它。

那么你肯定很快就迷路了。原型继承中没有类。
这就是重点!:-)


使用.prototypenew Function()语法并不是利用原型继承的一种非常明确的方式。

考虑使用Object.create代替new- 这种方式允许您直接说出哪个对象应该是哪个原型。它更简单,您可能会通过这种方式更快地掌握原型的概念。

另外,如果你想拥有更长的原型链,那么这种方法肯定会更舒服。

于 2012-11-14T12:36:39.810 回答
1

您定义了Personand Customer,然后将Customer's 原型设置为一个Person实例。所以,你的链看起来像这样:

myCustomer              (a Customer instance)
  Customer prototype    (a Person instance)
    Person prototype    (a plain object)

事实上,myCustomer是一个Customer实例,因为它Customer的链中有原型。这与直接Person实例不同。后者在链中不会有Customer' 原型。

于 2012-11-14T12:47:55.470 回答
0

我认为混淆在于“javascript引擎基本上调用原型的构造函数”。对于您的 Customer 的新实例,Javascript 将创建一个新对象,将原型设置为您指定的 Person 对象,然后调用您的 Customer 构造函数来自定义对象(这是 JS 中“类”的错觉)。没有重新调用原型构造函数。因此,您的客户字段/方法已在您的客户构造函数中设置。

当客户对象在构造后引用了方法/字段时,javascript 引擎将尝试在通过构造函数设置的字段/方法中找到它(或在构造函数调用下游操作对象的代码中)。如果不能,它将查看附加的原型对象以查找方法/字段。这样,客户字段/方法和“超类”字段/方法都可用。

于 2012-11-14T13:06:02.380 回答
0

如果客户原型是指个人对象等创建新客户对象应该只包含个人属性/方法而不是客户属性/方法。

是的。您新创建Customer的对象继承PersonCustomer.prototype. 由于您既没有向该原型对象添加属性,也没有在Customer构造函数中为您的实例创建属性,所以您的客户只包含该人的属性。

Customer 属性如何附加到新的 Customer 对象 (myCustomer)?

在构造函数中执行它:

function Customer (){
    this.customer_property = someValue;
}

每次通过创建实例时都会执行此代码new。如果您不需要,您可以将方法等添加到Customer.prototype对象中。

也看看What is the reason [not] to use the 'new' 关键字?- 你不应该为原型对象实例化 Person - 为什么所有客户都应该继承它的名称等?利用

function Customer(name) {
    Person.call(this, name); // apply Person constructor on this instance
                             // for creating own properties (and privileged methodes)
    // custom Customer code
}
Customer.prototype = Object.create(Person.prototype);
Customer.prototype.someMethod = … // Customer-specific prototype things
于 2012-11-14T12:39:17.017 回答