Object.prototype .__ defineGetter__ (and __defineSetter__) polyfill

I know that the name of the method __defineGetter__(s __defineSetter__) is really strange and outdated , but I find it more convenient than Object.defineProperty. Compare yourself:

//Readable
Something.prototype.__defineGetter__("name", function() {return this._name;});
//Uh... - what?
Object.defineProperty(Something.prototype, "name", {
                       get: function() {return this._name;}
                     });

Because, as I said, this method is out of date. Therefore, I create a polyfill to return it to bussiness:

if(!Object.prototype.__defineGetter__) {
  Object.prototype.__defineGetter__ = function(name, func) {
    Object.defineProperty(this, name, {
      get: func
    });
  }
}

It really just calls the standard one Object.defineProperty. I could call __defineGetter__what I wanted. I just decided to stick to what already existed.

The problem is that if I use __defineGetter__and __defineSetter__polyfills in one property, I called twice Object.defineProperty.

My question is: is it okay to call Object.definePropertytwice in the same property? Does it overwrite something for example?

+2
2

set get defineProperty, :

var proto = Object.prototype;

proto.__defineGetter__ = proto.__defineGetter__ || function(name, func) {
    var descriptor = Object.getOwnPropertyDescriptor(this, name);
    var new_descriptor = { get: func, configurable: true};
    if (descriptor) {
        console.assert(descriptor.configurable, "Cannot set getter");
        if (descriptor.set) new_descriptor.set = descriptor.set; // COPY OLD SETTER
    }
    Object.defineProperty(this, name, new_descriptor);
};

proto.__defineSetter__ = proto.__defineSetter__ || function(name, func) {
    var descriptor = Object.getOwnPropertyDescriptor(this, name);
    var new_descriptor = { set: func, configurable: true};
    if (descriptor) {
        console.assert(descriptor.configurable, "Cannot set setter");
        if (descriptor.get) new_descriptor.get = descriptor.get; // COPY OLD GETTER
    }
    Object.defineProperty(this, name, new_descriptor);
};
+2

defineProperty, . __defineGetter__ __defineSetter__? , .

2013 , 41 LOC-, :

npm install dictionary

, :

Something.prototype.define({
    get name() {
        return this._name;
    },
    set name(_name) {
        this._name = _name;
    }
});

, , . .

, :

Object.prototype.define = function (properties) {
    if (Object.isExtensible(this)) {
        var ownDescriptor = Object.getOwnPropertyDescriptor;
        var defineProperty = Object.defineProperty;
        var keys = Object.keys(properties);
        var length = keys.length;
        var index = 0;

        while (index < length) {
            var key = keys[index++];
            var descriptor = ownDescriptor(properties, key);
            defineProperty(this, key, descriptor);
        }
    }
};

, .

0

Source: https://habr.com/ru/post/1619553/


All Articles