2016-08-15 3 views
4

Я видел две различные методы внедрения неместных функций в JavaScript, Первый является:Object.defineProperty или .prototype?

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; 
} 

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

+0

[вы искали 'Object.defineProperty', чтобы попытаться понять, как это работает] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) ? – zzzzBov

+1

'enumerable',' configurable' и 'writeable' все по умолчанию' false' и, следовательно, не нужны. В любом случае, преимущество этого заключается в том, что, так как свойства, определенные таким образом, не перечислимы, настраиваются или записываются, все, что вы, вероятно, захотите. –

+0

Да, но нашли официальную документацию на 'developer.mozilla.org' немного запутанной. Если мы можем добавить свойство к прототипу определенных стандартных встроенных объектов, то что делает 'defineProperty' на самом деле, это путающая часть. – bantya

ответ

6

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

Первый отличается от второго в этом случае:

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

Writable - true означает, что вы можете изменить его значение, назначая какое-либо значение. Если ложь - вы не можете изменить значение

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

Enumerable - 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) ; 
 
}

Configurable - 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);

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

+0

Окк, это означает, что с помощью 'defineProperty' мы можем установить поведение требуемого свойства так, как мы хотим быть, верно? – bantya

+0

Да, вы правы. Если вы определите свойство и пропустите запись, перечислимые и настраиваемые их значения будут по умолчанию ложными –

+0

Спасибо за вашу демонстрацию с кодом, это действительно ** большая ** помощь в понимании сценария. Еще раз спасибо. , – bantya

Смежные вопросы