我对C#、Java等强类型OOP语言比较熟悉,所以对Javascript有点迷茫。我希望我的类
被封装,例如:
function Human() {
var _name = '';
var _nameChangeCounter = 0;
}
Human.constructor = Human;
Human.prototype = Object.create(Animal);
如您所见,Human
扩展了 Animal
类。现在我需要一个用于 Name
的 getter 和 setter,以及一个用于 NameChangeCounter
的 getter。在Name
的setter中,应该增加NameChangeCounter
。我在 this question 中查找了如何在 Javascript 中制作 getter 和 setter :
Name.prototype = {
get fullName() {
return this.first + " " + this.last;
},
set fullName(name) {
var names = name.split(" ");
this.first = names[0];
this.last = names[1];
}
};
可是,既然拿原型(prototype)来继承,那怎么办呢?我是否必须执行 Java 样式(创建 getName
、setName
、getNameChangeCounter
函数)? window.location.href
等属性是如何实现的?
最佳答案
这对我有用:
function Name(){
this.first = '';
this.last = '';
}
Name.prototype.getFullName = function() {
return this.first + ' ' + this.last;
}
Name.prototype.setFullName = function(fullName){
var names = fullName.split(" ");
this.first = names[0];
this.last = names[1];
}
function Human() {
var name = new Name(),
counter = 0;
Object.defineProperty(this, 'name', {
configurable: true,
enumerable: true,
get: function(){
return name;
},
set: function(fullName){
name.setFullName(fullName);
}
});
Object.defineProperty(this, 'counter', {
configurable:true,
enumerable: true,
get: function(){
return counter;
},
set: function(value){
counter = value;
}
});
}
var luke = new Human();
luke.name = 'Luke Skywalker';
console.log(luke.name.first); //Luke
console.log(luke.name.last); //Skywalker
console.log(luke.name.getFullName()); //Luke Skywalker
console.log(luke.name); //Object
luke.name = 'Peter Parker';
console.log(luke.name.first); //Peter
console.log(luke.name.last); //Parker
console.log(luke.name.getFullName()); //Peter Parker
关于javascript - 在 Javascript 的继承类中声明 getter/setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23408809/