2016-09-10 4 views
-1

Я хотел бы определить прототип на строке, которая является самоосуществляющимся функциюJavaScript - прототип как функция самопроверки вызывающем (IIFE)

String.prototype.overEstimatedLength = (function() { 
    return this.length + 12345 
})() 

, а затем использовать его как этот

'hello world'.overEstimatedLength 

К сожалению, это не работает. Является ли что-то подобное синтаксически возможным и почему - пример выше не работает?

Примечание: Я знаю, что определение свойства было бы более подходящим (например, Getter), меня особенно интересуют функции самозапускания.

+0

Какова цель создания псевдонима для '.length'? Обратите внимание: 'this' с IIFE не' String' – guest271314

+1

- это домашнее задание? С полчаса назад уже был подозрительно похожий вопрос: http://stackoverflow.com/questions/39431230/add-an-alias-for-a-property-in-javascript – vlaz

+2

Возможный дубликат [Javascript-получателей и сеттеров для dummies?] (http://stackoverflow.com/questions/812961/javascript-getters-and-setters-for-dummies) – Siguza

ответ

2

проблема с вашим примером является то, что есть на самом деле не такая вещь, как «само-вызова функции», только "сразу -инвинированное выражение функции ", с акцентом на сразу.

Рассмотрим что-то вроде этого:

String.prototype.foo = alert('foo'); 
'foo'.foo; 
'foo'.foo; 

Это работает alert('foo')сразу, а затем сохраняет результат в String.prototype.foo. , , а затем просто извлекает результат несколько раз (ничего не делая с ним). Таким образом, 'foo' получит предупреждение только один раз.

Ваш пример аналогичен; вы сразу вызывая выражение функции.

+0

отлично, спасибо, я принимаю ваш ответ. – lustoykov

+0

@leo: Добро пожаловать! – ruakh

1

Похоже, вы пытаетесь определить поглотитель на String.prototype

Object.defineProperty(String.prototype, 'overEstimatedLength', { 
 
    get: function() { 
 
    return this.length + 12345; 
 
    } 
 
}); 
 
console.log('hello'.overEstimatedLength)

Ваш код не работает, потому что он сразу же выполняет ваши функции и назначение результата, что String.prototype.overEstimatedLength , То есть, это почти точно так же, как ...

function myFunc() { 
    return this.length + 12345 
} 
String.prototype.overEstimatedLength = myFunc(); 

Следующая будет вид работы, но вы бы назвали его как функцию, заметьте, что вы возвращающая функцию, так что получает назначение в String.prototype

String.prototype.overEstimatedLength = (function() { 
 
    return function() { 
 
    return this.length + 12345; 
 
    } 
 
})() 
 

 
console.log('something'.overEstimatedLength())

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