javascript - js 继承的疑惑
迷茫
迷茫 2017-04-10 17:25:25
[JavaScript讨论组]
// 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之间的关系,大神们能不能帮我理一理他们之间的关系,用实例讲解一下他们之间的继承用法。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
PHPz

构造函数,原型,实例。
通过new构造函数创建实例,实例通过原型链可以访问原型链中的属性。在你上面的第一个例子中,Person是构造函数,Person.prototype是原型,M1M2是实例。

  • 定义在构造函数中的属性是私有属性,通过new创建的实例中的属性是实例本身的属性,它们与其他实例中的属性互不干扰

  • 定义在构造函数原型中的属性是共享属性,通过new创建的实例中的属性不存在于实例中,它们通过原型链找到构造函数原型中的同名属性,它们是共享的。改变一个实例中的属性,另一个实例中的属性也会改变。

建议你对原型(链)有一定的了解后看一下这篇文章:【JavaScript】【对象】更好地理解对象继承

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号