Объект.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);
и один совет ты,не меняйте прототипы сборки в типах.