javascript中 F.prototype=obj和F.prototype=obj.prototype有什么区别?
答案:2 悬赏:50 手机版
解决时间 2021-02-13 09:43
- 提问者网友:星軌
- 2021-02-13 06:31
javascript中 F.prototype=obj和F.prototype=obj.prototype有什么区别?
最佳答案
- 五星知识达人网友:像个废品
- 2021-02-13 07:42
都是对prototype的赋值,语义上没什么区别。差别在于对属性、方法的检索上,javascript的对象属性、方法的搜寻的过程是:
1、对象本身
2、对象prototype
3、对象prototype的prototype,类推。。。
javascript类的基础的处理上,一般有两种方式,一种引用原型的方式,另外是复制原型的方式,差别从名称上就能看出来,引用原型是直接引用父类的原型:
Function.prototype.classExtends = function ()
{
var F = function() { };
var class = new F();
class.prototype = this.prototype;
class.prototype.Super = this;
class.prototype.constructor = this;
return class;
}
function classA() {
};
var classB = classA.classExtends();
复制原型比较简单,是从父类的prototype复制所有的方法、属性到派生类的prototype,派生类和基类的prototype没有直接的引用关系,这部分就不给代码了。追问
还是给您看代码,superType.prototype赋值给了Object(),就出现了f.prototype=superType.prototype ,如果赋值给Object()的是superType,最后实例化后输出继承类属性是undefined,我想知道这个里面的内部运行机制
追答一般create用来返回类的实例,你这里用来做继承关系的处理,感觉有点怪异。
说说代码里面的问题:
create里面的object()的参数,应该是new superType(),不应该是superType.pototype;
还有,原型法的继承方式,是不能假定构造方法的,也就是说在SubType函数中,不应该使用SuperType.call来调用基类的构造,原型法的继承方式,一般是不带构造参数的,这本来就是原型法继承方式的一个缺陷。追问create函数名的问题我记下了 。
至于代码的问题,是没错的,这个是javascript高级程序设计章节中“寄生组合式继承”的示例代码,这个里面就是直接用的superType.prototype传递的参数 ,所以产生问题。用SuperType.call来调用基类的构造,就是为了解决子类型构造函数中向超类型构造函数传递参数。追答我看的类库很多,有几个是采用原型法继承方式的,没见过这么处理的。
那本书?让我开开眼!追问javascript高级程序设计
1、对象本身
2、对象prototype
3、对象prototype的prototype,类推。。。
javascript类的基础的处理上,一般有两种方式,一种引用原型的方式,另外是复制原型的方式,差别从名称上就能看出来,引用原型是直接引用父类的原型:
Function.prototype.classExtends = function ()
{
var F = function() { };
var class = new F();
class.prototype = this.prototype;
class.prototype.Super = this;
class.prototype.constructor = this;
return class;
}
function classA() {
};
var classB = classA.classExtends();
复制原型比较简单,是从父类的prototype复制所有的方法、属性到派生类的prototype,派生类和基类的prototype没有直接的引用关系,这部分就不给代码了。追问
还是给您看代码,superType.prototype赋值给了Object(),就出现了f.prototype=superType.prototype ,如果赋值给Object()的是superType,最后实例化后输出继承类属性是undefined,我想知道这个里面的内部运行机制
追答一般create用来返回类的实例,你这里用来做继承关系的处理,感觉有点怪异。
说说代码里面的问题:
create里面的object()的参数,应该是new superType(),不应该是superType.pototype;
还有,原型法的继承方式,是不能假定构造方法的,也就是说在SubType函数中,不应该使用SuperType.call来调用基类的构造,原型法的继承方式,一般是不带构造参数的,这本来就是原型法继承方式的一个缺陷。追问create函数名的问题我记下了 。
至于代码的问题,是没错的,这个是javascript高级程序设计章节中“寄生组合式继承”的示例代码,这个里面就是直接用的superType.prototype传递的参数 ,所以产生问题。用SuperType.call来调用基类的构造,就是为了解决子类型构造函数中向超类型构造函数传递参数。追答我看的类库很多,有几个是采用原型法继承方式的,没见过这么处理的。
那本书?让我开开眼!追问javascript高级程序设计
全部回答
- 1楼网友:街头电车
- 2021-02-13 08:32
//这段代码
说明如果集成ClassA.prototype便不具有ClassA的原有属性,但是如果集成ClassA对象的实例便具有了ClassA.prototype的属性
追问
superType.prototype赋值给了Object(),就出现了f.prototype=superType.prototype ,这个就无法理解了, 按照你的,那就不具有superType的原有属性了 还望解答
说明如果集成ClassA.prototype便不具有ClassA的原有属性,但是如果集成ClassA对象的实例便具有了ClassA.prototype的属性
追问
superType.prototype赋值给了Object(),就出现了f.prototype=superType.prototype ,这个就无法理解了, 按照你的,那就不具有superType的原有属性了 还望解答
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯