Подтвердить что ты не робот

Что такое замена суррогатного прототипа в javascript?

В файле underscore.js в комментариях указано:

// Naked function reference for surrogate-prototype-swapping.
var Ctor = function(){};
  • Что такое замена суррогата-прототипа?

или

  • Где я могу найти статью/очистить документацию об обмене суррогатом-прототипом?
4b9b3361

Ответ 1

"Смещение суррогатного прототипа" (что я сомневаюсь в том, что на самом деле стоит начать) использует объект только для назначения его прототипу. Эта переменная используется только один раз:

// Naked function reference for surrogate-prototype-swapping.
var Ctor = function(){};

var nativeCreate = Object.create;

// An internal function for creating a new object that inherits from another.
var baseCreate = function(prototype) {
    if (!_.isObject(prototype)) return {};

    if (nativeCreate) return nativeCreate(prototype);

    Ctor.prototype = prototype;
    var result = new Ctor;
    Ctor.prototype = null;
    return result;
};

Используется для создания кросс-браузерной версии Object.create. Вы не можете создать новый экземпляр объекта-прототипа напрямую, поэтому вы создаете временный объект с прототипом в качестве своего прототипа и возвращаете новый экземпляр этого файла.

Ответ 2

Сделано возможным с помощью Blender ответа. Предназначен для тех, кто находится на моем уровне.

Несмотря на то, что это не реальный термин, следующее разбиение предполагаемого значения замены суррогата-прототипа путем более полного комментирования оригинала underscore.js.

// A function which will be used as a constructor function in order 
// to add a prototype to a new object. There is nothing special about
// this function, except how it will be used.
var Ctor = function(){};

// Create a shortcut to Object.create if it exists. Otherwise
// nativeCreate will be undefined
var nativeCreate = Object.create;

// An internal function that will use or act as a polyfill for
// Object.create, with some type checking built in.
var baseCreate = function(prototype) {
    // Check if the object passed to baseCreate is actually an object.
    // Otherwise simply return an object (from an object literal), 
    // because there is not a valid object to inherit from.
    if (!_.isObject(prototype)) return {};

    // If Object.create is implemented then return the value
    // returned by Object.create when the prototype parameter is
    // passed into it. If Object.create has already been
    // implemented there is no need to recreate it. Just return
    // its return value.
    if (nativeCreate) return nativeCreate(prototype);

    // If Object.create is not defined then Ctor comes into play.
    // The object passed to baseCreate is assigned to the prototype
    // of Ctor. This means when Ctor is called prototype will be
    // the prototype assigned to this (the keyword this).
    Ctor.prototype = prototype;
    // Because Ctor is called with the new keyword this (the
    // keyword this) is returned returned by Ctor. Thus, the
    // variable 'result' is assigned an object with a prototype
    // equal to baseCreate parameter 'prototype'.
    var result = new Ctor;
    // Then to reset things Ctor.prototype is set to null.
    Ctor.prototype = null;
    // The newly created object, whose prototype is the object
    // passed to baseCreate is returned.
    return result;
};