Javascript:如果没有它可以实现继承,为什么要使用define prototype方法进行继承?

时间:2016-10-25 10:49:42

标签: javascript object inheritance prototype prototypal-inheritance

我提到this问题/答案来理解原型继承。

我知道扩展一个方法,我们需要在基类中定义Person.prototype.getName。因此,在子类中,它可以被称为myCustomer.sayMyName();

答案中的代码可归纳如下:

  function Customer(name) {
        this.firstName = name;
    };
    function User() {
     
    }

    Customer.prototype.hi = function() {
        console.log('Test method of parent');
    }	

    User.prototype = new Customer('shaadi');
    var myUser = new User();
    myUser.hi();

但问题是,如果我可以使用以下语法调用相同的内容,我为什么要使用原型

我的代码:

function Customer(name) {
        this.firstName = name;
        this.hi= function() {
            console.log('Test method of parent');
        }	
    };
    function User() {
     
    }
    User.prototype = new Customer('shaadi');
    var myUser = new User();
    myUser.hi();

我可以使用父方法而不定义Customer.prototype.hi,那么为什么/何时应该使用Customer.prototype.hi

如果两个解决方案都允许我访问父方法,我为什么要选择前者?

3 个答案:

答案 0 :(得分:2)

内存使用情况..

在第二个示例中,对象的每个实例都将拥有它自己的函数副本hi()..

通过在原型上放置函数hi(),只有一个函数实例。如果你创建了数千个这样的对象,那么就可以节省大量内存。

答案 1 :(得分:0)

前者的内存使用情况要好得多,因为该方法只定义了一次。

第二个例子是在每个实例上声明函数。

此外,可以修改/覆盖原型方法,并将更改继承到正在使用的每个实例中。

e.g。

function Customer(name) {
    this.firstName = name;
};
function User() {

}

Customer.prototype.hi = function() {
    console.log('Test method of parent');
}   

User.prototype = new Customer('shaadi');
var myUser = new User();
Customer.prototype.hi = function() {
    console.log('New Test method of parent');
} 
myUser.hi();

在调用自定义类和用户类之后,上面的原型函数会发生变化,但是它的更改仍会对所有实例产生影响。

答案 2 :(得分:0)

您的两个示例非常接近功能相同。差异可能最好用类比来解释:

假设您有一个目录树A及其要在其他目录中显示的文件B& C。你可以采取两种方式:

  1. A及其所有内容复制到BC,因此在A中有3个独立的数据副本。

    < / LI>
  2. AB内放置C的链接。 A中的数据只存在一次,但BC也可以访问和显示。

  3. 在第二种情况下,这也意味着更改A中的一个文件将显示BC中的更改,与更改原型属性相同将影响所有实例类。