js 继承js constructor属性 属性被改写对以后的继承有什么影响

我们为什么需要做A.prototype.constructor=A这样的修正?
在原型继承的时候,我们将上级函数的实例赋值给了下级函数的原型,所以就会造成下级函数原有的原型发生彻底的改变。因为constructor属性是原型默认的两个属性之一。该属性在正常情况下是等于其对应的函数本身的。但是在实现原型继承之后,下级函数的constructor属性就会发生改变,变为了等于上级函数本身。
但是如果我们不进行修正的话也可以正常使用,不会发生什么问题。那么我们修正这个constructor属性就只是为了防止一种情况下出错。例如,我不知道person对象是在哪个函数实例化出来的,但是我想克隆一个,这时候就可以这样:
var person = new Person();
var person1 = person.constructor();
参考博客:,这篇博客介绍的很详细,包括原先继承的概念也做了介绍,感兴趣的同学可以看一下。
访问:32928次
排名:千里之外
原创:50篇
(5)(12)(16)(18)JavaScript类和继承 constructor属性
转载 & & 作者:
本文介绍了JavaScript里面的constructor属性。这个属性是理解JavaScript类和继承的重要基础。
constructor属性始终指向创建当前对象的构造函数。比如下面例子:比如下面例子:
代码如下: // 等价于 var foo = new Array(1, 56, 34, 12); var arr = [1, 56, 34, 12]; console.log(arr.constructor === Array); // true // 等价于 var foo = new Function(); var Foo = function() { }; console.log(Foo.constructor === Function); // true // 由构造函数实例化一个obj对象 var obj = new Foo(); console.log(obj.constructor === Foo); // true // 将上面两段代码合起来,就得到下面的结论 console.log(obj.constructor.constructor === Function); // true
但是当constructor遇到prototype时,有趣的事情就发生了。 我们知道每个函数都有一个默认的属性prototype,而这个prototype的constructor默认指向这个函数。如下例所示:
代码如下: function Person(name) { this.name = }; Person.prototype.getName = function() { return this. }; var p = new Person("ZhangSan"); console.log(p.constructor === Person); // true console.log(Person.prototype.constructor === Person); // true // 将上两行代码合并就得到如下结果 console.log(p.constructor.prototype.constructor === Person); // true
当时当我们重新定义函数的prototype时(注意:和上例的区别,这里不是修改而是覆盖),constructor属性的行为就有点奇怪了,如下示例:
代码如下: function Person(name) { this.name = }; Person.prototype = { getName: function() { return this. } }; var p = new Person("ZhangSan"); console.log(p.constructor === Person); // false console.log(Person.prototype.constructor === Person); // false console.log(p.constructor.prototype.constructor === Person); // false
为什么呢? 原来是因为覆盖Person.prototype时,等价于进行如下代码操作:
代码如下: Person.prototype = new Object({ getName: function() { return this. } });
而constructor属性始终指向创建自身的构造函数,所以此时Person.prototype.constructor === Object,即是:
代码如下: function Person(name) { this.name = }; Person.prototype = { getName: function() { return this. } }; var p = new Person("ZhangSan"); console.log(p.constructor === Object); // true console.log(Person.prototype.constructor === Object); // true console.log(p.constructor.prototype.constructor === Object); // true
怎么修正这种问题呢?方法也很简单,重新覆盖Person.prototype.constructor即可:
代码如下: function Person(name) { this.name = }; Person.prototype = new Object({ getName: function() { return this. } }); Person.prototype.constructor = P var p = new Person("ZhangSan"); console.log(p.constructor === Person); // true console.log(Person.prototype.constructor === Person); // true console.log(p.constructor.prototype.constructor === Person); // true
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具js中的复制继承,如果继承对象本身就有那个属性,那么继承过后会改变改对象的属性吗?_百度知道
js中的复制继承,如果继承对象本身就有那个属性,那么继承过后会改变改对象的属性吗?
我实验的不会?不知道对不对?
我有更好的答案
你所谓的“复制继承”是指?“继承对象”是指——派生类的对象还是基类的对象?如果可能的话,最好提供一小段代码演示一下“复制继承”是怎么继承的。在我印象里“复制继承”好像不是一个很规范的名字,你是在哪本书上看来的吗?英文JS资料里我从未见过可以翻译成“复制继承”的术语。
我说的复制继承是将一个对象中的属性通过赋值的方式给另一个属性!我看的燕十八的视频
天,就是用for in遍历,逐个“赋值”啊?——这还能叫“继承”吗?我无意冒犯燕十八(第一次听说),但我认为这真是个糟糕的命名!你这么做,其实执行的根本不是“继承”,而是“拷贝(或复制)”,而且是“浅拷贝”,看个例子:var o1={ a:[999], b:2 }, o2 = {};
for (pn in o1) {
o2[pn] = o1[pn]; }现在,o2.a是数组[999],o2.b是2,对吧?再执行一句:o1.a[0] = 123;我问你,o2.a[0]此时等于什么?
采纳率:55%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 js constructor 继承 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信