我提到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
?
如果两个解决方案都允许我访问父方法,我为什么要选择前者?
答案 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
。你可以采取两种方式:
将A
及其所有内容复制到B
和C
,因此在A
中有3个独立的数据副本。
在A
和B
内放置C
的链接。 A
中的数据只存在一次,但B
和C
也可以访问和显示。
在第二种情况下,这也意味着更改A
中的一个文件将显示B
和C
中的更改,与更改原型属性相同将影响所有实例类。