2013-06-08 2 views
1

Мне было интересно, если это возможно: передать объект функции и переопределить весь объект с полным другим объектом внутри этой функции, чтобы его значение было постоянно изменено. Поскольку объекты передаются по ссылке, у меня возникает ощущение, что она должна работать как-то, но я понятия не имею, как это сделать. Для того, чтобы поместить его в код, он должен сделать что-то вроде этого:Переопределение объекта, переданного функции

function a() { 
    console.log("i am a"); 
} 

function b() { 
    console.log("i am b"); 
} 

function override(func1, func2) { 
    func1 = func2; 
} 

override(a, b); 

a(); //"i am b" expected 

FIDDLE

Это, очевидно, не работает, потому что я просто переопределение переменной func1, но я думаю, вы получите идею. И я решил использовать функции вместо чистых объектов, потому что вы могли бы легко «переопределить» объект, просто удалив его свойства и скопировав новые свойства со второго объекта. Но этого я не хочу.

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

Спасибо!

ответ

3

Это не работает, потому что, хотя JS передает ссылки на функции, которые просто означает, что ваши func1 и func2 параметры в конечном итоге ссылаясь на те же функции (объекты), что идентификаторы a и b относятся к, но когда вы изменить то, что func1 относится к этому не влияет то, что относится к a.

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

+0

Так что, делая что-то вроде 'a = b', я на самом деле просто изменяю, что означает' a', но не действительно значение, которое 'a' ссылается, до этого момента? – basilikum

+0

Да, предполагая, что мы говорим об объектах (а не о примитивном числе или строках или каких-либо значениях) 'a = b' означает« изменить то, что означает 'a', так что оно относится к тому же, что и' b'. Это не влияет на вещь 'a', упомянутую до этого _except_, что если' a' относится к объекту, к которому не относятся никакие другие переменные, тогда этот объект будет собираться мусором. – nnnnnn

+0

Хорошо, это имеет смысл. Таким образом, нет абсолютно никакой возможности для того, чтобы динамически изменять данные, к которым относится какой-то объект, к чему-то совершенно другому?Я имею в виду, что оператор присваивания в моем вопросе состоял только в том, чтобы сделать идею понятной, но, возможно, есть что-то еще, что можно было бы сделать? – basilikum

0

В код

function override(func1, func2) { 
    func1 = func2; 
} 

func1 является переменной, которая указывает функционировать a и func2 это переменная, которая указывает функционировать b. Заявление func1 = func2 составляет func1 указывает на b. Это ничего не меняет вне функции override.

Просьба использовать объекты для использования пройти по ссылке. Приведенный ниже код иллюстрирует, как это работает.

function a() { 
    console.log("i am a"); 
} 

function b() { 
    console.log("i am b"); 
} 

var object1 = { 
    func1:a 
}; 

var object2 = { 
    func2:b 
} 


function override(object1, object2) { 
    object1.func1 = object2.func2; 
} 

override(object1, object2); 

object1.func1(); //"i am b" 

Этот код предназначен для демонстрации, возможно, не будет полезен в реальном сценарии.

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