Объект JavaScript может иметь опытную цепочку, но также и быть функцией?

Для Scala> = 2.12 используйте Source.fromResource:

scala.io.Source.fromResource("located_in_resouces.any")
17
задан Daniel Cassidy 5 December 2008 в 17:21
поделиться

4 ответа

На самом деле оказывается, что это возможно , хотя в нестандартный путь.

Mozilla, WebKit, Blink/V8, Носорог и ActionScript обеспечивают нестандартное __proto__ свойство, которые позволяют изменять прототип объекта после того, как это было создано. На этих платформах следующий код возможен:

function a () {
    return "foo";
}

a.b = function () {
    return "bar";
}

function c () {
    return "hatstand";
}
c.__proto__ = a;

c(); // returns "hatstand"
c.b(); // returns "bar"; inherited from a

Это могло бы быть полезно для любого, кто не должен волноваться о межплатформенной совместимости.

Однако примечание, что только эти свойства из объекта могут быть наследованы. Например:

var d = {};
d.__proto__ = a;
d.b(); // returns "bar"
d(); // throws exception -- the fact that d is inheriting from a function
     // doesn't make d itself a function.
10
ответ дан 30 November 2019 в 13:22
поделиться

Короткий ответ: не возможный.

Эта строка Вашего кода:

var d = new c();

автоматически предполагает, что d объект. Если c не конструктор встроенного объекта, например, Function. Но если c уже определяется языком, Вы не можете управлять его прототипом и не можете "наследовать" его от того, что Вы любите. Ну, в некоторых интерпретаторах Вы можете, но Вы не можете сделать этого безопасно через все интерпретаторы — в стандарте говорится: "Вы не смешивает со стандартными объектами, или интерпретатор ударит Вас!".

встроенные объекты "уникальны", и JavaScript не обеспечивает способы копировать их. Не возможно воссоздать Строку, Число, Функцию, и так далее не обращаясь к несовместимому обману.

8
ответ дан 30 November 2019 в 13:22
поделиться

Это должна на самом деле быть цепочка прототипа? Можно использовать смесительный шаблон, чтобы заставить функцию иметь все свойства вместо этого. Можно даже обернуть его в хороший "новый" синтаксис для фальсифицирования его, если Вы действительно хотите.

function a () {
    return "foo";
}

a.b = function () {
    return "bar";
}

function c () {
    var f = function(){
        return a();
    };

    //mixin all properties on a
    for(var prop in a){
        f[prop] = a[prop];
    }

    return f; //just returns the function instead of "this"
};

var d = new c(); //doesn't need the new keyword, but just for fun it still works

alert(d()); //show "foo"

alert(d.b()); //shows "bar"

можно добавить свойства к d, не влияя a. Единственная разница между этим и что Вы хотите, - то, что изменения в желании не влияют на существующие "экземпляры" c.

1
ответ дан 30 November 2019 в 13:22
поделиться

Да, это возможно, если вы используете свойство __ proto __ , упомянутое Дэниелом Кэссиди. Хитрость заключается в том, чтобы c фактически возвращал функцию, к цепочке прототипов которой было прикреплено a .

function a () {
    return "foo";
}

a.b = function () {
    return "bar";
}

function c () {
    var func = function() {
        return "I am a function";
    };
    func.__proto__ = a;
    return func;
}
c.prototype = a;

var d = new c();
d.b(); // returns "bar"
d(); // returns "I am a function"

Однако вам нужно будет еще немного настроить цепочку прототипов, если вы хотите, чтобы instanceof возвращал лучшие результаты.

d instanceof c // true
d instanceof a // false
c instanceof a // false
3
ответ дан 30 November 2019 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: