各位大神,请教一些概念上的问题。

ttod_qzstudio 2017-12-06 05:06:24
大家好,JavaScript有些问题真是看得晕头转向,只好麻烦各位大神给解惑:
var A = function()
{
this.x = 0;
}
A.prototype.C = function()
{
alert(this.x);
}

var B = function()
{
A.call(this);
}
上面这个是不是等同于写了:
var B = function()
{
this.x = 0;
}
而且B的prototype与A的prototype目前还没有关系?



B.prototype = new A;
这是让prototype指向了对象A还是指向了A.prototype?,还是说这两者没有区别?
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttod_qzstudio 2017-12-06
  • 打赏
  • 举报
回复
引用 6 楼 jslang 的回复:
对用了 B.prototype = new A;就不需要执行A.call(this);了。 但是只简单的这样设置继承有四个缺点:   缺点一:执行上面代码会发现父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。   缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有什么影响。但是Array和Object类型就会有问题。就如你的代码那样   缺点三:如果父类的构造函数需要参数,我们就没有办法了。   缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。 为了解决这四个缺点,正确的继承方法如下:
function SubClass(){
	SuperClass.call(this);
}
SubClass.prototype = Object.create(SuperClass.prototype);//ie9+
/* ie9以下用下面代码
var Bs = function(){};
Bs.prototype = SuperClass.prototype;
SubClass.prototype = new Bs();
*/
SubClass.prototype.constructor = SubClass;

引用 6 楼 jslang 的回复:
对用了 B.prototype = new A;就不需要执行A.call(this);了。 但是只简单的这样设置继承有四个缺点:   缺点一:执行上面代码会发现父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。   缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有什么影响。但是Array和Object类型就会有问题。就如你的代码那样   缺点三:如果父类的构造函数需要参数,我们就没有办法了。   缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。 为了解决这四个缺点,正确的继承方法如下:
function SubClass(){
	SuperClass.call(this);
}
SubClass.prototype = Object.create(SuperClass.prototype);//ie9+
/* ie9以下用下面代码
var Bs = function(){};
Bs.prototype = SuperClass.prototype;
SubClass.prototype = new Bs();
*/
SubClass.prototype.constructor = SubClass;

真的是非常感谢您如此耐心详细的讲解!虽然我目前还不是完全理解您上面所写的内容,但是也获益良多。诸多概念我会慢慢消化,实在是辛苦您了。 再次表示感谢!
天际的海浪 2017-12-06
  • 打赏
  • 举报
回复
对用了 B.prototype = new A;就不需要执行A.call(this);了。 但是只简单的这样设置继承有四个缺点:   缺点一:执行上面代码会发现父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。   缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有什么影响。但是Array和Object类型就会有问题。就如你的代码那样   缺点三:如果父类的构造函数需要参数,我们就没有办法了。   缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。 为了解决这四个缺点,正确的继承方法如下:
function SubClass(){
	SuperClass.call(this);
}
SubClass.prototype = Object.create(SuperClass.prototype);//ie9+
/* ie9以下用下面代码
var Bs = function(){};
Bs.prototype = SuperClass.prototype;
SubClass.prototype = new Bs();
*/
SubClass.prototype.constructor = SubClass;

ttod_qzstudio 2017-12-06
  • 打赏
  • 举报
回复
如果B包含了x属性,那么后面的 var B = function() { A.call(this); } 是不是就多余了,直接写 var B = function() { } 不就行了?
ttod_qzstudio 2017-12-06
  • 打赏
  • 举报
回复
引用 3 楼 jslang 的回复:
[quote=引用 2 楼 ttod 的回复:] [quote=引用 1 楼 jslang 的回复:] 都不是 B.prototype = new A; 是先用A类(构造函数)创建一个实例对象。让B的prototype指向这个实例对象
如果是这样的话,您是说B.prototype指向了A的对象,而不是A的对象的prototype属性所指向的对象?[/quote] B.prototype指向A的实例对象。而A的实例对象的原型(__proto__)指向A.prototype 也就是 B.prototype.__proto__ 等于 A.prototype [/quote] 非常感谢您的回复。 B.prototype.__proto__ 等于 A.prototype可不可以理解成B.prototype包含了A.prototype的功能? 由于前面 var A = function() { this.x = 0; } 那么 B.prototype = new A; 执行了之后,B包含了x属性么?
天际的海浪 2017-12-06
  • 打赏
  • 举报
回复
引用 2 楼 ttod 的回复:
[quote=引用 1 楼 jslang 的回复:] 都不是 B.prototype = new A; 是先用A类(构造函数)创建一个实例对象。让B的prototype指向这个实例对象
如果是这样的话,您是说B.prototype指向了A的对象,而不是A的对象的prototype属性所指向的对象?[/quote] B.prototype指向A的实例对象。而A的实例对象的原型(__proto__)指向A.prototype 也就是 B.prototype.__proto__ 等于 A.prototype
ttod_qzstudio 2017-12-06
  • 打赏
  • 举报
回复
引用 1 楼 jslang 的回复:
都不是 B.prototype = new A; 是先用A类(构造函数)创建一个实例对象。让B的prototype指向这个实例对象
如果是这样的话,您是说B.prototype指向了A的对象,而不是A的对象的prototype属性所指向的对象?
天际的海浪 2017-12-06
  • 打赏
  • 举报
回复
都不是 B.prototype = new A; 是先用A类(构造函数)创建一个实例对象。让B的prototype指向这个实例对象

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧