// 1
var Person = function(){
}
Person.level = 1;
Person.prototype.name = "None";
Person.prototype.age = "None";
Person.prototype.arr = new Array(1,2);
var M1 = new Person;
var M2 = new Person;
M1.name = "ZHANG";
M1.arr.push(3);
console.log(M1.arr +" " +M2.arr);// output : 1,2,3 1,2,3
// 2
function Human(){
this.arr = new Array(1,2);
}
var p1 = new Human();
var p2 = new Human();
p1.arr.push(3);
console.log(p1.arr +" " +p2.arr);// output : 1,2,3 1,2
方式1原型继承的arr存储的是数组的引用,导致M1修改后,M2也变了。可是为什么用方式2,改p1.arr却不会影响p2.arr,方式2中存的不是数组的引用吗?
还有看了很多继承的资料,还是不太清楚prototype , __proto__ , constructor之间的关系,大神们能不能帮我理一理他们之间的关系,用实例讲解一下他们之间的继承用法。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
构造函数,原型,实例。
通过
new构造函数创建实例,实例通过原型链可以访问原型链中的属性。在你上面的第一个例子中,Person是构造函数,Person.prototype是原型,M1、M2是实例。定义在构造函数中的属性是私有属性,通过
new创建的实例中的属性是实例本身的属性,它们与其他实例中的属性互不干扰。定义在构造函数原型中的属性是共享属性,通过new创建的实例中的属性不存在于实例中,它们通过原型链找到构造函数原型中的同名属性,它们是共享的。改变一个实例中的属性,另一个实例中的属性也会改变。
建议你对原型(链)有一定的了解后看一下这篇文章:【JavaScript】【对象】更好地理解对象继承