有关 JavaScript 中实例的 constructor 属性的问题。

2015-05-31 16:42:06 +08:00
 haozhang
function A () {};
function B () {};
B.prototype = new A();
var a = new A();
var b = new B();
log(a.constructor); // A
log(b.constructor); // A

js中实例是有一个constructor属性指向它的构造函数的。
如上面的A类的实例a,它的constructor属性就指向A。
但是当B继承了A之后,B的实例b的constructor指向的却不是B类,而是父类A。

4109 次点击
所在节点    JavaScript
48 条回复
haozhang
2015-05-31 16:46:25 +08:00
markdown不起作用啊...谁教教我怎么搞。
haozhang
2015-05-31 16:50:55 +08:00
原来还要选择markdown...不能改成默认的么...
ceoimon
2015-05-31 16:58:30 +08:00
constructor 属性是在构造函数的原型对象上的。你这里将 B 的原型对象赋值成一个 A 类实例,此时 B 的原型对象上的就没有 constructor,但继承了 A 的原型链 ,于是 log(b.constructor); 输出的是原型链上 A 的原型对象上的 constructor 即 A 函数。(好像有点乱,我也是个新手,个人是这么理解的。)
haozhang
2015-05-31 17:05:29 +08:00
@ceoimon 我去...做了个实验,实例上没有constructor属性...《JS高程》上讲过实例有constructor属性的啊...xd你的理解是对的。
Septembers
2015-05-31 17:31:39 +08:00
Gem
2015-05-31 17:31:53 +08:00
@haozhang 看这里,秘密花园 => https://bonsaiden.github.io/JavaScript-Garden/zh/ ==>[对象.原型]
haozhang
2015-05-31 17:37:55 +08:00
@Septembers 我讲constructor属性...你给的两个链接连毛的constructor都没见着..
haozhang
2015-05-31 17:40:23 +08:00
@Gem 《js高程》的p145讲了实例也有constructor属性...但明显错了,原型对象才有constructor属性...实例的能访问constructor属性是因为原型上有...
joeyzh
2015-05-31 17:48:02 +08:00
haozhang
2015-05-31 17:54:49 +08:00
@joeyzh 看三楼的,因为原型对象是有constructor属性的,而实例没有。b.constructor是沿着原型链搜索到了A.prototype.constructor。
joeyzh
2015-05-31 18:04:03 +08:00
@haozhang 的确,学习了。
哪个天煞的教材当时写了对象.constructor这样的东西!
haozhang
2015-05-31 18:04:48 +08:00
@joeyzh 《js高级程序设计》...
yangmls
2015-05-31 18:08:48 +08:00
引用一段来自 Backbone 的继承方法

`
function A () {};
function B () {};

var Surrogate = function(){ this.constructor = B; };
Surrogate.prototype = A.prototype;
B.prototype = new Surrogate;

var a = new A();
var b = new B();
console.log(a.constructor);
console.log(b.constructor);
`
haozhang
2015-05-31 18:10:54 +08:00
@yangmls 干脆不管constructor...
ibigbug
2015-05-31 18:14:10 +08:00
B.prototype.constructor = A

直接覆盖原型的话,要修正一下这个属性
joeyzh
2015-05-31 18:14:43 +08:00
可以理解为是引用实例的构造函数的一种方式?
yangmls
2015-05-31 18:16:52 +08:00
@haozhang 虽然这个属性没什么卵用,但我们还是应该尽量保持它的正确性,万一哪天你想在实例化以后修改原型链,可以用a. constructor.prototype.xxx = ... 来修改
haozhang
2015-05-31 18:18:30 +08:00
@ibigbug 原型继承的话... B.prototype.constructor指向的不就是A么...
haozhang
2015-05-31 18:20:14 +08:00
@yangmls 说的也是哦~
haozhang
2015-05-31 18:20:45 +08:00
@joeyzh 嗯,就是找到这个对象对应的类是哪个,一般用于类型检验吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/195097

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX