我正在尝试找出一种子类访问父类的方法,当父类永远不知道它有哪些子类时?
我正在使用Object.create来创建我的类,现在我正在这样做。请注意子类“obj.parent = parentClass”
必须有更好的方法来做到这一点,但我不知道。
var parentClass = (function() {
var obj = Object.create({});
var _parentProperty = 'foo';
Object.defineProperties(obj,
{
'parentProperty': {
configurable: false,
enumerable: true,
set: function(value) {
_parentProperty = value;
},
get: function() {
return _parentProperty;
}
},
'parentMethod': {
value: function() {
alert('Parent method called');
},
writable: false,
configurable: false,
enumerable: false
}
}
);
return obj;
})();
var childClass = (function() {
var obj = Object.create(parentClass);
obj.parent = parentClass;
var _childProperty = 'bar';
Object.defineProperties(obj,
{
'childProperty': {
configurable: false,
enumerable: true,
set: function(value) {
_childProperty = value;
},
get: function() {
return _childProperty;
}
},
'childMethod': {
value: function() {
alert('Child method called');
},
writable: false,
configurable: false,
enumerable: false
},
'callParent': {
value: function() {
alert(this.parent.parentProperty);
this.parent.parentMethod();
},
writable: false,
configurable: false,
enumerable: false
}
}
);
return obj;
});
var myClass = new childClass();
myClass.callParent();
答案 0 :(得分:1)
<script>
var parentClass = (function() {
var obj = Object.create({});
var _parentProperty = 'foo';
return Object.defineProperties(obj,
{
'parentProperty': {
configurable: false,
enumerable: true,
set: function(value) {
_parentProperty = value;
},
get: function() {
return _parentProperty;
}
},
'parentMethod': {
value: function() {
alert('Parent method called');
},
writable: false,
configurable: false,
enumerable: false
}
}
);
})();
var childClass = (function() {
var obj = Object.create(parentClass);
obj.parent = parentClass
var _childProperty = 'bar';
return Object.defineProperties(obj,
{
'childProperty': {
configurable: false,
enumerable: true,
set: function(value) {
_childProperty = value;
},
get: function() {
return _childProperty;
}
},
'childMethod': {
value: function() {
alert('Child method called');
},
writable: false,
configurable: false,
enumerable: false
},
'callParent': {
value: function() {
alert(this.parent.parentProperty);
this.parent.parentMethod();
},
writable: false,
configurable: false,
enumerable: false
}
}
);
});
var myClass = new childClass();
myClass.callParent();
</script>