javascript和node.js:oop

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)

谢谢大家.

Ben*_*aum 6

这就是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)