Так что я создаю некоторые цепочки, которые выполняют простые проверки типов. В настоящее время, я должен назвать свои функции, как это:API: Создание функций конструктора без привязки к скобкам в JavaScript
Proceed().if('someString').is.a('string');
Но я действительно хочу для моего API, чтобы выглядеть следующим образом:
proceed.if('someString').is.a('string');
Обратите внимание, что во втором примере кода открывающая и закрывающая скобки отсутствуют при первом вызове функции.
Как вы можете видеть из приведенной ниже коды, я уже понял, как получить is
и a
работать, но я не могу показаться, чтобы найти способ, чтобы удалить скобки из функции Proceed()
.
Вот пример код, который работает:
function Proceed() {
if (!(this instanceof Proceed)) {
return new Proceed();
}
this.target = "";
}
Proceed.prototype.if = function (target) {
this.target = target;
return this;
}
Proceed.prototype.a = function (type) {
console.log(this.target + ' === ' +type, typeof this.target === type);
};
Object.defineProperty(Proceed.prototype, 'is', {
get: function() {
return this;
}
});
Proceed().if('someString').is.a('string'); // true
Proceed().if('someString').is.a('function'); // false
// Everything Above this line Works!
И теперь, моя попытка удалить скобки из Proceed()
выглядит следующим образом:
Object.defineProperty(Proceed.prototype, 'proceed', {
set: function(){},
get: function(){
return Proceed(this);
},
configurable: true
});
proceed.if('someString').is.a('string'); // ReferenceError
proceed.if('someString').is.a('function'); // ReferenceError
Ошибка я получаю от здесь это:
Uncaught ReferenceError: proceed is not defined
Если я поменяю Proceed.prototype
на Object.prototype
, тогда я могу заставить его работать, но это значит, что я расширил собственный объект, что может быть проблематичным.
Так кто-нибудь знает, как я могу это сделать без опасного расширения родного объекта? Что я здесь делаю неправильно?
Here is a jsFiddle with the above code samples.
Любая помощь приветствуется.
UPDATE # 1 Этот код разрабатывается в качестве узлового модуля, так что не будет никакого доступа к window
объекта браузера.
Не думаю, что вы можете без расширения объекта или окна. Я тестировал с окном вместо Proceed: https://jsfiddle.net/Lw29zyf1/4/ –