Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Object.create() циклическая ссылка (https://javascript.ru/forum/misc/60058-object-create-ciklicheskaya-ssylka.html)

SunYang 09.12.2015 11:57

Object.create() циклическая ссылка
 
Здравствуйте.

Есть объект:
App = {
	foo : function() {
		//...
	}
}

Создаю свойство App.Section, которое является объектом, прототипом которого является App (родительский объект)
App.Section = Object.create( App );

// далее создаю методы объекта App.Section
App.Section.boo = function() {
	// ...
}
// и т.д


Когда смотрю в firebug получается бесконечно раскрывающееся дерево:

App.Section -- App.Section.Section -- App.Section.Section.Section и т.д.

Т.е. Section раскрывается до бесконечности, ибо он яляется свойством App и пронаследован от App.

Нормально ли такое поведение?

Цель была, чтобы в this в App.Section был App, а не только App.Section без доступа к методам App через this.

madCoder 12.12.2015 13:54

разница между твоим кодом и моим только в том что ты перезаписываешь скрытое свойство __proto__
(Object.create);

var app = {
	method: function () {return this.age},
}
app.Section = {App: app}


можно делать так
var app = {
	method: function () { return this.age },
}

var obj = Object.create(app);
obj.age = 22;

console.log(obj)

pnpquest 13.12.2015 08:17

Цитата:

Сообщение от SunYang
Нормально ли такое поведение?

Нормально. Сейчас в JS алгоритм сборки типа swap and sweep, твою циклическую ссылку он заметет, если что, когда app исчезнет из root.

pnpquest 13.12.2015 08:18

Цитата:

Сообщение от madCoder
ты перезаписываешь скрытое свойство __proto__

Ничего он там не перезаписвает

pnpquest 13.12.2015 08:27

кстати, даже в нэйтив подобные вещи есть
alert(window == window.window)

madCoder 13.12.2015 15:06

var app = {
	method: function () {}
}

app.obj = {};
app.obj.__proto__ = app; // это тоже самое что Object.create(app);


console.log(app)

pnpquest 13.12.2015 15:41

ага
var app = {}
app.__proto__ = Object.prototype // это тоже самое что var app = {} или app = Object.create(Object.prototype);

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

nerv_ 13.12.2015 15:56

Цитата:

Сообщение от SunYang
Цель была, чтобы в this в App.Section был App, а не только App.Section без доступа к методам App через this.

я бы сделал как-то так:
'use strict';


class Section {
  constructor(app) {
  	this.app = app;
  }
  test(x) {
    this.app.test(x);
  }
};


class App {
  constructor() {
  	this.section = new Section(this);
  }
  test(x) {
  	alert(x);
  }
  static isApp(any) {
  	return any instanceof App;
  }
};


let app = new App();


alert(App.isApp(app));
alert(App.isApp(app.section.app));

app.test(1);
app.section.test(2);


Часовой пояс GMT +3, время: 20:26.