2015-02-23 3 views
2

Как выход 6to5 У меня есть следующий код:6To5 Компилятор - использовать __proto__ для наследования

var _inherits = function (subClass, superClass) { 
    if (typeof superClass !== "function" && superClass !== null) { 
     throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); 
    } 
    subClass.prototype = Object.create(superClass && superClass.prototype, { 
     constructor: { 
     value: subClass, 
     enumerable: false, 
     writable: true, 
     configurable: true 
     } 
    }); 
    // question is about next row 
    if (superClass) subClass.__proto__ = superClass; 
    }; 
_inherits(Controller, CoreController); 

Кто-нибудь может описать то, что для обновления использовало __proto__ недвижимости? Как я пытаюсь - он ничего не полезен

P.S. а documentation says что прото должен быть объектом, но в коде используется для функции

установки

ответ

2

Он используется для 'статических»свойств наследования Пожалуйста, смотрите пример кода ниже:.

class Parent { 
myMethod() {} 
} 

console.log(Parent.prototype.myMethod); // [Function] 
console.log(Parent.prototype.hasOwnProperty('myMethod')); // true 
console.log(Parent.myMethod); // undefined 

class Child extends Parent {} 

console.log(Child.prototype.myMethod); // Function 
console.log(Child.prototype.hasOwnProperty('myMethod')); // false 
console.log(Child.myMethod); // undefined 

Parent.myStaticProp = 42; 

console.log(Parent.prototype.myStaticProp); // undefined 
console.log(Parent.myStaticProp); // 42 
console.log(Parent.hasOwnProperty('myStaticProp')); // true 

console.log(Child.prototype.myStaticProp); // undefined 
console.log(Child.myStaticProp); // 42 
console.log(Child.hasOwnProperty('myStaticProp')); // false 

Кроме того, в подобном вопросе о github, yuchi сказал:

Обратите внимание, как' статические свойства добавляются после расширения.

Это устарело, потому что оно не дает переводчику aw ay знать заранее, что объект (функция в этом случае) имеет другую прототипную цепочку , чем стандартную. Каждый интерпретатор JS реализует , и это потому, что до сих пор нет идеального соглашения о Object.setPrototypeOf, фактически по соображениям производительности IMO.

И похоже, что 6to5 хочет быть максимально совместимым с ES6 семантикой, поэтому установка Child. proto Родитель является приемлемым компромисс.

Подробное обсуждение вы можете найти по ссылке: https://github.com/babel/babel/issues/87#issuecomment-60139066

Кроме того, вы можете посмотреть на хороший вопрос от basarat о мутирует [[Prototype]] и производительность по ссылке: Why is mutating the [[prototype]] of an object bad for performance?

+1

Ваш ответ бесполезен без ссылки. Ответы должны быть самодостаточными. Просьба привести соответствующую информацию в свой ответ. –

+0

Я уже добавил ссылку на длинное и подробное обсуждение от авторов кода из вопроса, это очень полезно, я думаю. – ebaranov

+0

Опять же, ответы должны быть ** автономными **. Если ссылка по какой-либо причине недоступна, ваш ответ бесполезен. См. Http://stackoverflow.com/help/how-to-answer. –

3

Кто-нибудь может описать, что для обновления используется __proto__ недвижимость?

Спецификации ES6, которые, когда классы наследуют друг от друга, результирующие функции-конструкторы также должны наследовать друг от друга. CoreController.isPrototypeOf(Controller) даст true.

Как я попробовать - это не делает ничего полезного не

Это очень полезно для наследования статических свойств, которые размещены на функции конструктора в JS.

CoreController.hi = console.log.bind(console, "hello world"); 
CoreController.hi(); // hello world 
Controller.hi(); // error 
_inherits(Controller, CoreController); 
Controller.hi(); // hello world 

документация говорит, что прото должен быть объект, но в коде используется для установки функцию

Каждая функция является объектом JS. Он имеет прототип, и он может служить одним.

+0

Это поведение не может быть определено с помощью subClass.prototype = Object.create (superClass && superClass.prototype, {- это обычная практика. Что для обновления __proto__? –

+0

Да, это поведение невозможно определить с помощью 'Object.create', поскольку 'Object.create' не создает объекты функции. В чем ваш вопрос? – Bergi

+0

Object.create - создать объект со всеми свойствами CoreController. И установите его в прототип Controller - так что экземпляр контроллера будет иметь все свойства как Controller –

2

Не совсем ответ на ваш вопрос, но больше предупреждения о переопределяя наследования:

Назначение на __proto__ свойство объекта или используя ES6 эквивалент Object.setPrototypeOf() имеет серьезные последствия производительности на любом пути кода, который прикасались такой объект.

Blog post with benchmarks с указанием влияния на производительность.

Firefox выдает предупреждение, когда вы делаете это:

mutating the [[Prototype]] of an object will cause your code to run very slowly; 
instead create the object with the correct initial [[Prototype]] value using Object.create 

Цитирую mozilla bug 984146

__proto__ смертельна для вывода типа, в основном, после того, как делать это это означает, что Вывод типа не может следовать ни одному из свойств объекта , поскольку вы изменяете поиск базового объекта за его спиной.

Это в основном означает, что каждый поиск по этому объекту или любому объекту , созданный с помощью этого конструктора, будет возвращаться к медленному пути для свойств чтения/записи объекта. Я мог бы оценивать этот вопрос , Эрик знал бы лучше. (ni: efaust)

Это еще хуже.

При установке __proto__, вы не только губит любые шансы вы можете имели для будущих оптимизаций от Ion на этом объекте, но вы также заставить двигатель идти ползать вокруг всех остальных частей TI (информацию о возвращаемых значениях функции или значениях свойств, которые, по их мнению, знают об этом объекте и сообщают им не , также допускают множество предположений, что предполагает дальнейшую деоптимизацию и, возможно, недействительность существующего jitcode.

Изменение прототипа объекта в середине исполнения является действительно противный кувалды, и единственный способ, которым мы должны держать от быть неправильным, чтобы играть безопасно, но безопасно медленно. Если возможно, попробуйте создать , создав непосредственно цепочку прототипов. Если у нас действительно есть динамические цепи прототипов вокруг динамически, я не уверен, что у меня есть замечательный совет относительно того, как минимизировать последствия этого действия .

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