javascript - 请问一下关于js new的一个问题
迷茫
迷茫 2017-04-10 14:58:09
[JavaScript讨论组]
function a(){
    this.a=1;
}
function b(){
    this.b=2;
}
a.prototype.showa=function(){
    console.log("showaaaaaaaa");
}
b.prototype.showb=function(){
    console.log("showbbbbbbb");
} 
// a=new b();//与下面的区别
a.prototype=new b();
console.log(a);
console.log(a.prototype);

上面两个new的区别在哪?

迷茫
迷茫

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

全部回复(3)
大家讲道理

new A操作符会完成以下步骤:
1. 创建一个对象temp = {},
2. temp.__proto__ = A.prototype,
3. A.call(temp, arguments),
4. return temp.

如果你有这样一个函数

javascriptfunction A (name) {
    this.name = name;
}
A.prototype.age = 12;

当你使用var a = new A('John');时,构造函数返回给你的应该是a = {name: 'John'}.但是实际上你得到的是a = {name: 'John', age: 12}.why?

这就是js的原型链,它规定访问一个对象(a)的属性(age)时a.age,如果在当前对象a上找不到,则它会去它的__proto__属性上找,即a.__proto__.age,而a.__proto__ = A.prototype, 而A.prototype.age = 12,所以a.age会返回12。

以上能解释你的第一个,至于第二个B.prototype = new A,做一下拆分并添加一个B的实例如下

javascriptvar a = new A;
B.prototype = a;
var b = new B

结合下面的等式

javascripta.__proto__ = A.prototype
b.__proto__ = B.prototype
B.prototype = a

所以b.__proto__.__proto__ = A.prototype,这样你可能看不出来什么东西,我们在A.prototype上添加一个方法sayb及B.prototype上都没有

A.prototype.say = function () {
    console.log('A say');
}

当我们调用b.say()时,由原型链,log出‘A say’.
若果我们也为B.prototype添加上say方法

javascriptB.prototype.say = function () {
    console.log('B say');
}

再调用b.say()时,是‘B say’。这正是继承与覆写


补充一点:__proto__是隐藏属性,但chrome和firefox是能访问的

迷茫

去看js的原型链继承,这是js的基础啊

伊谢尔伦

建议花点时间读读这篇文章
再谈Javascript原型继承,读到圣杯模式即可。
#重要提醒#文章作者自己的办法代码有BUG,条件表达式符号顺序搞反了,递归函数似乎无法终止,调用深拷贝继承父类原型函数deepClone(Parent.prototype)没有传入第二个参数等问题。

/*
*赋予变量a一个b的实例,这样之后就无法执行
* var foo = new a();
* 会报Uncaught TypeError: object is not a function错误
*/
a = new b(); 
/*
*这里是修改了a(函数)的原型对象,使得原来a上的原型链关系发生了改变
*仍然可以执行var foo = new a();
*但是foo对象也是b的类型,即执行foo instanceof b结果为true
*/
a.prototype = new b();
function a(){
    this.a=1;
}
function b(){
    this.b=2;
}
a.prototype.showa=function(){
    console.log("showaaaaaaaa");
}
b.prototype.showb=function(){
    console.log("showbbbbbbb");
}
function (){
    console.log("showbbbbbbb");
}
var foo1 = new a();

foo1 instanceof a //true
foo1 instanceof b //false
a.prototype = new b()

var foo2 = new a();

foo2 instanceof a //true
foo2 instanceof b //true
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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