Я создаю объект внутри корпуса. Также во вложении находятся частные свойства, к которым могут обращаться функции объекта - и это работает как ожидалось.
Моя проблема: я хочу, чтобы другие могли расширять мой объект с помощью своих собственных функций (функций из другого контекста), но этим функциям также потребуется доступ к тем же закрытым свойствам - и я не смог найти способ сделать эту работу.
Я пробовал различные конфигурации .call, а также, среди прочего, обернул их функции в новую функцию. Я чувствую, что приблизился к решению, но только что потерпел неудачу.
Вот немного упрощенного примера кода, который точно отражает мою ситуацию:
//extension object
//fn2 can be any function, with any number of arguments, etc.
var obj1 = {};
obj1.fn2 = function (s1, s2){ console.log(priv); };
//actual object
var obj2 = (function (){
//private property
var priv = "hello world";
//return object
var obj3 = {};
//return object's native fn (works)
obj3.fn = function (s){ console.log(priv); };
//extension happens here - but is obviously not correct
obj3.fn2 = obj1.fn2;
//return object
return obj3;
})();
//try output
obj2.fn("goodbye world"); //works
obj2.fn2("goodbye world", "thx 4 teh phish"); //fails
Любое понимание будет оценено. И я полностью понимаю, что то, что я хочу, просто невозможно, но, похоже, так оно и должно быть: P
РЕДАКТИРОВАТЬ: Спасибо всем за ответы. Я полностью понимаю, что к свойствам легче получить доступ как к общедоступным, и что обычно унаследованные объекты не будут иметь доступа к ним в противном случае. Однако, поскольку новая функция присоединяется к исходному объекту, я должен верить, что есть способ использовать исходный контекст, а не контекст, в котором была создана новая функция.
Теперь я первый, кто сказал, что eval - это зло, и, на самом деле, я никогда не использовал его или даже не думал об его использовании, прежде. Тем не менее, я пытаюсь сделать все возможное, чтобы сделать эту работу - и я наткнулся на это (на первый взгляд) рабочее решение:
obj3.fn2 = eval (obj1.fn2.toString ());
Итак, если я проверю, чтобы убедиться, что obj1.fn2 является функцией typeof, есть ли способ, который может быть вредным для моего кода? Он не выполняет функцию, поэтому я не вижу, как, но, может быть, я что-то упустил?