Ser*_*MAN 2 javascript arrays oop node.js
我有一个问题node.js结构与javascript oop.我用另一个类创建了一个类.
var base = function (name) {
this.Rows = new Array();
};
var top = function (name) {
this.name = name;
};
top.prototype = new base();
var myClass = new top("");
myClass.Rows.push("a");
console.log(myClass.Rows);
var myClass2 = new top("test");
myClass2.Rows.push("b");
console.log(myClass2.Rows);
Run Code Online (Sandbox Code Playgroud)
此代码返回以下结果;
[ 'a' ]
[ 'a', 'b' ]
Run Code Online (Sandbox Code Playgroud)
但是我不必通过算法找到这段代码的结果?
[ 'a' ]
[ 'b' ]
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮忙.
解决了:我解决了这个问题.重构代码;
var base = function (name) {
this.Rows = new Array();
}
var top = function(name) {
top.prototype.constructor.call(this, name);
this.name = name;
}
top.prototype = Object.create(new base());
Run Code Online (Sandbox Code Playgroud)
谢谢大家.
这就是JavaScript的原型继承的工作原理.
这对语言的新手来说似乎相当混乱:)
这两个对象myClass,并myClass2具有相同的原型(设置top.prototype = new base();)
这意味着当您访问他们的Rows属性时,因为他们都没有,他们访问他们的原型之一.因为它们都是相同的,所以它们都作用于同一个物体.如果将行添加console.log(myClass2.Rows);到代码的末尾,它也会输出 [ 'a', 'b' ]
原型继承似乎让初学者感到困惑,因为在经典语言中,如果类A扩展了类,B那么所有A的属性都被复制到了B- 在JavaScript中并非如此.
如果将代码重构为以下内容,则可以完成相同的功能:
var base = function () {
};
base.prototype.getRows = function(){
return this.rows;
}
var top = function (name) {
this.name = name;
this.rows= [];
};
top.prototype = new base();
var myClass = new top("");
myClass.getRows().push("a");
console.log(myClass.getRows());
var myClass2 = new top("test");
myClass2.getRows().push("b");
console.log(myClass2.getRows());
Run Code Online (Sandbox Code Playgroud)
这将产生您期望的"经典"结果.
但是,JavaScript的原型模型更侧重于共享功能.我可能会将您的代码重构为:
var myClass = {Rows:[]},myClass2 = {Rows:[]};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |