2016-08-04 1 views
-1

Как установить Object.prototype.somefunction является `readonly`?

var obj = {}; 
 
console.log(obj.constructor === Object); // true 
 
console.log(typeof obj.constructor); // function 
 

 
obj['foo'] = 'bar'; 
 
obj['constructor'] = 'String'; 
 

 
console.log(obj.constructor === Object); // false 
 
console.log(typeof obj.constructor); // string

Я хочу упомянуть случай в этом примере: В obj объекте, я добавил новое имя свойства constructor со значением String. И тип значения - string.

So: 'string' !== 'function'.

Поскольку я переопределяю его как второй, я не могу использовать его как функцию в качестве первой.

Это также означает: некоторые разработчики js (почти) не хотят объявлять свойство, имя которого находится в объекте constructor. Если я попытаюсь это сделать, значение constructor будет отменено.

же в другом случае:

var array = []; 
 
console.log(typeof array.forEach); // function 
 

 
array['forEach'] = 'String'; 
 
console.log(typeof array.forEach); // string

Почему JS не принимает несколько ключей с одинаковыми именами, но разница типов значений?

То, что я хочу добиться:

var action = { 
    isDone: false, 
    isDone: function (flag) { 
     this.isDone = flag 
    } 
}; 

action.isDone(progressing is done); 
if (action.isDone) { 
    // done... 
} 

// 'boolean' !== 'function' 

Мои вопросы:

1 /. Как определить новое свойство для объекта с тем же ключом? (не дублировать с другими темами, потому что same key but differnce value types);

2 /. Это лучший способ предотвратить переопределение свойства объекта? (Или readonly как название)

var obj = {}; 
Object.defineProperty(obj, 'constructor', { 
    get: function() { 
     return function() { 
      // default constructor here... 
     } 
    }, 
    set: function (newValue) { 
     // do nothing here... 
    } 
}) 

ответ

0

Как определить новое свойство объекта с таким же ключом? (не дублировать с другими темами, потому что те же ключевые, но разные типы значений);

Вы не можете

Это лучший способ предотвратить переопределить свойство объекта?

Уверенный, но вы все еще, вероятно, используете его неправильно. И любой код, который вы пишете вокруг него, вероятно, плохой JavaScript.


Какой бы язык вы ни выбрали, я предлагаю не пытаться реализовать другие идиомы в JavaScript. JavaScript - это его собственная вещь. Узнайте, как писать идиоматический JavaScript.

+0

я происхожу из C# :( –

1

var obj = { 
 
\t }; 
 

 
// being explicit 
 
Object.defineProperty(obj, 'testFunction', { 
 
    writable: false, 
 
    value: function(){ 
 
\t console.log("Print read only Function"); 
 
\t return; 
 
    } 
 
}); 
 

 
console.log(obj.testFunction.toString()); 
 

 

 
obj.testFunction(); 
 

 
obj.testFunction= function(){ 
 
\t console.log("Override Function"); \t 
 
} 
 

 
console.log(obj.testFunction.toString()); 
 
obj.testFunction();

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

  • Нет связанных вопросов^_^