// Don't break the function prototype.
// pd - https://github.com/Raynos/pd
var proto = Object.create(Function.prototype, pd({
"prop": 42
}));
var f = function() { return "is a function"; };
f.__proto__ = proto;
console.log(f.hasOwnProperty("prop")); // false
console.log(f.prop); // 42
console.log(f()); // "is a function"
.__proto__
không chuẩn và không được dùng nữa.Làm cách nào để kế thừa các hàm javascript?
Làm cách nào để kế thừa tạo mẫu đối tượng nhưng có đối tượng đó là hàm.
Object.create
trả về đối tượng không phải là chức năng.
new Constructor
trả về đối tượng không phải là chức năng.
Động lực: - Một cross-browser finherit
var finherit = function (parent, child) {
var f = function() {
parent.apply(this, arguments);
child.apply(this, arguments);
};
f.__proto__ = parent;
Object.keys(child).forEach(function _copy(key) {
f[key] = child[key];
});
return f;
};
Tôi không tin rằng điều này là có thể, vì vậy chúng tôi có lẽ nên đề xuất một Function.create
đến es-thảo luận mailing list
/*
Creates a new function whose prototype is proto.
The function body is the same as the function fbody.
The hash of propertydescriptors props is passed to defineproperties just like
Object.create does.
*/
Function.create = (function() {
var functionBody = function _getFunctionBody(f) {
return f.toString().replace(/.+\{/, "").replace(/\}$/, "");
};
var letters = "abcdefghijklmnopqrstuvwxyz".split("");
return function _create(proto, fbody, props) {
var parameters = letters.slice(0, fbody.length);
parameters.push(functionBody(fbody));
var f = Function.apply(this, parameters);
f.__proto__ = proto;
Object.defineProperties(f, props);
return f;
};
})();
Như đã đề cập trong chuỗi thảo luận có tồn tại một ES: strawman <|
nhà điều hành nguyên mẫu sẽ cho phép điều này.
Chúng ta hãy xem những gì nó sẽ trông giống như sử dụng <|
var f1 = function() {
console.log("do things");
};
f1.method = function() { return 42; };
var f2 = f1 <| function() {
super();
console.log("do more things");
}
console.log(f1.isPrototypeOf(f2)); // true
console.log(f2()); // do things do more things
console.log(f2.hasOwnProperty("method")); // false
console.log(f2.method()); // 42
'console.log (f.apply);' sẽ trả về 'undefined' ... vì vậy cách này không tối ưu theo bất kỳ cách nào ... vẫn đang nghĩ về giải pháp thay thế. –
@ FelixKling Tôi quên rằng tôi nên kế thừa từ 'Function.prototype' cảm ơn – Raynos
Có [câu hỏi này] (http://stackoverflow.com/questions/6564481/javascript-polymorphic-callable-objects) Tôi gặp phải một lúc trở lại người hỏi đã tham chiếu [bài viết này] (http://ajaxian.com/archives/javascript-tips-for-rookies-and-gurus) cho thấy một mẫu để tạo * "các đối tượng có thể gọi được đa hình" *. Không chắc chắn nếu đó là những gì bạn đang sau, nhưng có thể có giá trị một cái nhìn. – user113716