我正在学习javascript中的类和继承。我认为以下是扩展现有对象的相当标准的方法,因为我从Object.create的MDN文档中获得了样式
我期待看到“确定”,然后看到“是!控制台中的“ Hello”,但出现此错误:
Uncaught TypeError: #<MyPromise> is not a promise
at new MyPromise (<anonymous>:5:17)
at <anonymous>:19:6
Run Code Online (Sandbox Code Playgroud)
看起来Promise构造函数正在抛出异常,因为它可以告诉我给我初始化的对象不是一个简单的Promise。
我希望Promise构造函数初始化我的对象,就像它是一个Promise对象一样,这样我就可以扩展该类。他们为什么不编写Promise构造函数来使用这种通用模式?难道我做错了什么?为您加油!
MyPromise = function(message, ok) {
var myPromise = this;
this.message = message;
this.ok = ok;
Promise.call(this, function(resolve, reject) {
if(this.ok) {
console.log('ok');
resolve(myPromise.message);
} else {
console.log('not ok');
reject(myPromise.message);
}
});
};
MyPromise.prototype = Object.create(Promise.prototype);
MyPromise.prototype.constructor = MyPromise;
(new MyPromise('Hello', true))
.then(function(response) {console.log('Yay! ' + response);})
.except(function(error) {console.log('Aww! ' + error);});
Run Code Online (Sandbox Code Playgroud)
我最初试图制作一个可以使用的BatchAjax类,例如:
(new BatchAjax([query1, query2]))
.then(function(response) {console.log('Fires when …Run Code Online (Sandbox Code Playgroud) 我想覆盖Promise构造函数和Promise中的then方法。因此,每当有人创建一个新的Promise对象时,首先将执行我的代码,然后将调用原始的promise构造函数。
同样,当有人调用Promise的.then函数时,首先将执行我的代码,然后将执行该then函数的回调。
我试过了
var bind = Function.bind;
var unbind = bind.bind(bind);
function instantiate(constructor, args) {
return new (unbind(constructor, null).apply(null, args));
}
var oldProto = Promise.prototype;
Promise = function() {
console.log("Promise instantiated");
var promise = instantiate(Promise, arguments);
return promise;
};
Promise.prototype = oldProto;
Run Code Online (Sandbox Code Playgroud)
当使用
var myFirstPromise = new Promise((resolve, reject) => {
setTimeout(function(){
resolve("Success!"); // Yay! Everything went well!
}, 250);
});
myFirstPromise.then((successMessage) => {
console.log("Yay! " + successMessage);
});
Run Code Online (Sandbox Code Playgroud)
它导致无限循环,控制台充满了Promise instantiated日志。我还尝试了以下方法:
Promise = function(Promise) {
MyPromise.prototype …Run Code Online (Sandbox Code Playgroud)