JS defineProperty and prototype

后端 未结 6 1723
误落风尘
误落风尘 2020-12-02 08:15

As you know we can define getters and setters in JS using defineProperty(). I\'ve been stuck when trying to extend my class using defineProperty().

6条回答
  •  时光取名叫无心
    2020-12-02 08:54

    This solution is without extra memory consumption. Your updated code is close. You just need to use this.props[field_name] instead of direct this[field_name].

    Please note that defineProperty call replaced to Object.create

    Js Fiddle http://jsfiddle.net/amuzalevskyi/65hnpad8/

    // util
    function createFieldDeclaration(fields) {
        var decl = {};
        for (var i = 0; i < fields.length; i++) {
            (function(fieldName) {
                decl[fieldName] = {
                    get: function () {
                        return this.props[fieldName];
                    },
                    set: function (value) {
                        this.props[fieldName] = value;
                    }
                }
            })(fields[i]);
        }
        return decl;
    }
    
    // class definition
    function User(id, name) {
        this.props = {};
        this.id = id;
        this.name = name;
    }
    User.prototype = Object.create(Object.prototype, createFieldDeclaration(['id','name']));
    
    // tests
    var Alex = new User(0, 'Alex'),
        Andrey = new User(1, 'Andrey');
    
    document.write(Alex.name + '
    '); // Alex document.write(Andrey.name + '
    '); // Andrey Alex.name = "Alexander"; document.write(Alex.name + '
    '); // Alexander document.write(Andrey.name + '
    '); //Andrey

提交回复
热议问题