有关 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。

4320 次点击
所在节点    JavaScript
48 条回复
haozhang
2015-05-31 23:21:38 +08:00
@Biwood 不是这个意思,自带就像是function A(){},然后A就有prototype这个属性了。是语言设计层面的...
joyee
2015-05-31 23:26:17 +08:00
@haozhang 其实只要把 JavaScript 的 OO 部分都看成在原型链这个“搜索路径”上做文章,然后知道 new 和创建函数会对这条搜索路径干什么事,各种引用是怎么搜索的,完全不要去联想 C++/Java 那种 OO,就一切都很自然……
liebesbrief
2015-06-01 01:24:15 +08:00
昂......路過.......表示题主头像是我做的哦............好欣慰~
haozhang
2015-06-01 10:16:58 +08:00
@liebesbrief 我在lofter上看到的...直接盗用了...
haozhang
2015-06-01 10:19:43 +08:00
@joyee 看看es6就知道js肯定会向Java那类语言的OO靠拢的...慢慢变成工业级语言...
andy1987
2015-06-01 16:31:37 +08:00
Class.prototype.constructor
joyee
2015-06-01 16:56:59 +08:00
@haozhang ES6 的 class 本质还是 prototype,类似于 CoffeeScript 的 class,纯粹的语法糖……而且 TC39 也是倾向于只让它停留在语法糖的层面上,现在在 es-discuss 谈论给 JavaScript 加上“真正的OO”的人基本都会被婊……
kenshin
2015-06-01 16:59:55 +08:00
JavaScript基于原型链的继承,B.prototype = new A(); 相当于 B.prototype.constructor === a.constructor === A

所以:
log(a.constructor); // A
log(b.constructor); // A

类似这种情况,需要手动改回B.property.constructor,即:B.prototype.constructor = B

但这种继承方式多了一步 new A(相当于做了2次new A),为了避免内存浪费,可以使用下面的方式:
function A () {};
function B () {};
function F () {}; (空函数)

F.prototype = A.prototype
B.prototype = new F()
B.prototype.constructor = B

var a = new A();
var b = new B();

log(a.constructor); // A
log(b.constructor); // B

PS,这种方式也有缺点(B只继承了A.prototype上的属性),如这样就有错误了:
function A () {
this.foo = "only a";
};
function B () {};

function F () {};
F.prototype = A.prototype
B.prototype = new F()
B.prototype.constructor = B

var a = new A();
var b = new B();

log(b.foo) //undefined


更完美的方案,可以看看 CoffeeScript / TypeScript 生成的JS代码,很清晰。 :)

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

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

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

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

© 2021 V2EX