Dee*_*ons 7 javascript oop class object prototype-programming
Family = function(name) {
this._Name = name;
}
Family.prototype = {
getName: function() {
return this._Name;
},
People: function(num) {
this._Number = num;
}
}
Family.People.prototype = {
clearNumber: function() {
this._Number = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
人是一个嵌套的类.它的父类是Family.
我得到了Family.People
未定义的错误.有人可以纠正上面的代码吗?
// function doesn't need "new" operator
var Family = function(name) { this._Name = name; };
Family.prototype = {
getName: function() { return this._Name; }, // missing comma
People: function(num) {
this._Number = num;
}
};
// work with prototypes
Family.prototype.People.prototype = {
clearNumber: function() { this._Number = 0; }
};
Run Code Online (Sandbox Code Playgroud)
这会奏效.但是你必须要注意,当你打电话时:
var f = new Family("Doe");
Run Code Online (Sandbox Code Playgroud)
f.People
它只是一个对象构造函数,而不是某个其他对象的实例.你必须实例化它,如:
f.members = new f.People(3);
Run Code Online (Sandbox Code Playgroud)
你在你的实例中有一个构造函数,这是相当混乱的.
因此,如果您以这种方式编写原型可能会更好:
var Family = function(name) {
this._Name = name;
this.getName = function() { return this._Name; };
};
Family.People = function(num) {
this._Number = num;
this.clearNumber = function() { this._Number = 0; };
};
Run Code Online (Sandbox Code Playgroud)
这实际上是一个类(而不是实例)中的类.所以上线将以这种方式调用:
var f = new Family("Doe");
f.members = new Family.People(3);
Run Code Online (Sandbox Code Playgroud)
向下钻取f
实例看起来像:
f
_Name
getName()
members
_Number
clearNumber()
Run Code Online (Sandbox Code Playgroud)
var Family = function(name) {
var _name = name;
this.getName = function() { return _name; };
};
Family.People = function(num) {
var _num = num;
this.getNumber = function() { return _num; }
this.clearNumber = function() { _num = 0; };
};
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我们将变量设为私有且只能在其中访问,因此无法在外部进行操作.您必须始终使用函数来操作它们.这使得它更加健壮,尤其是当存在与变量值相关的某些业务规则时.
var f = new Family("Doe");
f._name; // this is undefined because "_name" is private closure variable
Run Code Online (Sandbox Code Playgroud)
向下钻取f
实例现在看起来更像是一个类对象实例:
f
getName()
members
getNumber()
clearNumber()
Run Code Online (Sandbox Code Playgroud)
请注意,您正在分配Family.prototype.People
然后尝试访问Family.People
.
Family
它不是一个实例,Family
因此它没有该类的属性 - 因此您试图在该第三个语句中访问Family
它的实例.(这有点简化)Function
Function.prototype.People
即你想要做的是
Family.prototype.People.prototype = {
clearNumber:function(){this._Number = 0;}
}
Run Code Online (Sandbox Code Playgroud)
你在人们面前也错过了一个逗号,但我认为这是一个错字...