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

标签 javascript oop encapsulation getter-setter

我对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/

相关文章:

c++ - 在 for 循环中删除 vector 中的对象时,如何防止发生段错误?

C#:public new string ToString() VS public override string ToString()

python - 方法的装饰器参数不能是基于类的静态成员的列表理解

javascript - 如何封装跨多个 Controller 设置 $scope 值?

javascript - 想一次性多处变色!

javascript - Rhino load() 函数在 javax.script 提供的 JavaScript 中可用吗?

clone - 封装聚合/组合

java - 我是否总是需要克隆一个对象以确保 Java 中的封装?

javascript - 根据选择字段值加载页面时隐藏 DIV

javascript - 使用 ES5 语法在 Node 中混合默认和命名导出