gpt4 book ai didi

javascript - 在 Javascript 的继承类中声明 getter/setter

转载 作者:搜寻专家 更新时间:2023-11-01 04:31:46 24 4
gpt4 key购买 nike

我对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 样式(创建 getNamesetNamegetNameChangeCounter 函数)? 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com