我想在js中使用继承概念,所以我做的是
function myGarage(x) {
var _x = x;
Object.defineProperty(this, "BenZ", {
get: function () {
return _x;
},
set: function (value) {
_x = value;
},
enumerable: true,
configurable: true
});
}
myGarage.prototype = new MyCar();
function MyCar() {
var _x =0;
Object.defineProperty(this, "Audi", {
get: function () {
return _x;
},
set: function (value) {
_x = value;
},
enumerable: true,
configurable: true
});
}
在此之后我创建了myGarage
的实例。
var g1 = new myGarage(true);
var g2 = new myGarage(false);
var g3 = new myGarage("null");
这里的问题是,当我设置g1.Audi = 10;
时,myGarage
的所有其他实例的奥迪将保留样本值
(例如)
g1.Audi = 10;
var a = g2.Audi // a is 10
var b = g3.Audi; // b is 10
但我将值设置为g1。
我需要的是其他实例必须保持默认值或未定义
答案 0 :(得分:3)
首先,车库不会从汽车继承,而是宁愿持有许多汽车实例。
其次,您没有使用javascript对象模型,而是使用闭包。在闭包模型中,一个对象 不拥有“它的数据”,但被视为一个愚蠢的商店,关闭真正的所有者 数据。使用闭包模型会丢失继承等功能。
要使用继承,您可以这样做:
function MyCar() {
this.Audi = 0;
}
MyCar.prototype = {
//Todo: name the method properly
setAudi: function(audi) {
this.Audi = audi; //Do bunch of other stuff here
},
constructor: MyCar
};
function MyGarage(x) {
this.Benz = x;
}
MyGarage.prototype = Object.create( MyCar.prototype );
MyGarage.prototype.constructor = MyGarage;
MyGarage.prototype.garageMethod1 = function() {
};
var g1 = new MyGarage(null),
g2 = new MyGarage(false),
g3 = new MyGarage(true);
console.log( g1.Benz, g2.Benz, g3.Benz );
//null false true
上面有一些样板,可以通过许多库来减轻。我没有任何特别的建议。
有关javascript对象模型的更多信息:https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model
答案 1 :(得分:0)
检查John Resig的这个简单的javascript继承,你会发现它很棒: http://ejohn.org/blog/simple-javascript-inheritance/
答案 2 :(得分:0)
尝试以下代码,这很好用,
$(document).ready(function () {
var g1 = new MyGarage(true);
var g2 = new MyGarage(false);
var g3 = new MyGarage("null");
g1.Audi = 10;
var a = g2.Audi
var b = g3.Audi;
});
function MyCar() {
var _x = 1;
Object.defineProperty(this, "Audi", {
get: function () {
return _x;
},
set: function (value) {
_x = value;
},
enumerable: true,
configurable: true
});
}
function MyGarage(x) {
MyCar.apply(this, arguments);
var _x = x;
Object.defineProperty(this, "BenZ", {
get: function () {
return _x;
},
set: function (value) {
_x = value;
},
enumerable: true,
configurable: true
});
}
MyGarage.prototype = new MyCar();