Объект.defineProperty или.прототип?

Я видел два разных метода реализации неродных функций в javascript, Во-первых:

if (!String.prototype.startsWith) {
    Object.defineProperty(String.prototype, 'startsWith', {
        enumerable: false,
        configurable: false,
        writable: false,
        value: function(searchString, position) {
            position = position || 0;
            return this.lastIndexOf(searchString, position) === position;
        }
    });
}

и второе:

String.prototype.startsWith = function(searchString, position) {
    position = position || 0;
    return this.lastIndexOf(searchString, position) === position;
}

Я знаю, что второй используется для присоединения любого метода к цепочке прототипов конкретных стандартных встроенных объектов, но первый метод для меня новый. Может ли кто-нибудь объяснить, в чем разница между ними, почему один используется и почему нет, и каковы их значения.

1 ответов


в двух случаях вы добавляете новое свойство "startsWith" в String.prototype.

первый отличается от второго в данном случае:

вы можете настроить свойства enumerable, writable и configurable.

записи - true означает, что вы можете изменить его значение присвоить любое значение. Если false - вы не можете изменить значение

Object.defineProperty(String.prototype, 'startsWith', {
        enumerable: false,
        configurable: false,
        writable: false, // Set to False
        value: function(searchString, position) {
            position = position || 0;
            return this.lastIndexOf(searchString, position) === position;
        }
    });

var test = new String('Test');

test.startsWith = 'New Value';
console.log(test.startsWith); // It still have the previous value in non strict mode

перечисли - true означает, что это будет видно в for in петли.

Object.defineProperty(String.prototype, 'startsWith', {
        enumerable: true, // Set to True
        configurable: false,
        writable: false, 
        value: function(searchString, position) {
            position = position || 0;
            return this.lastIndexOf(searchString, position) === position;
        }
    });

var test = new String('Test');

for(var key in test){
   console.log(key)  ;
}

настраиваемые!--21--> -true если и только если тип этого дескриптора свойств может быть изменен и если свойство может быть удалено из соответствующего объекта.

Object.defineProperty(String.prototype, 'startsWith', {
            enumerable: false,
            configurable: false, // Set to False
            writable: false, 
            value: function(searchString, position) {
                position = position || 0;
                return this.lastIndexOf(searchString, position) === position;
            }
        });

    
    delete String.prototype.startsWith; // It will not delete the property
    console.log(String.prototype.startsWith);

и один совет ты,не меняйте прототипы сборки в типах.