Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.12.2015, 11:57
Профессор
Отправить личное сообщение для SunYang Посмотреть профиль Найти все сообщения от SunYang
 
Регистрация: 22.02.2008
Сообщений: 189

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.
Ответить с цитированием
  #2 (permalink)  
Старый 12.12.2015, 13:54
Интересующийся
Отправить личное сообщение для madCoder Посмотреть профиль Найти все сообщения от madCoder
 
Регистрация: 01.12.2015
Сообщений: 10

разница между твоим кодом и моим только в том что ты перезаписываешь скрытое свойство __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)

Последний раз редактировалось madCoder, 12.12.2015 в 13:59.
Ответить с цитированием
  #3 (permalink)  
Старый 13.12.2015, 08:17
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

Сообщение от SunYang
Нормально ли такое поведение?
Нормально. Сейчас в JS алгоритм сборки типа swap and sweep, твою циклическую ссылку он заметет, если что, когда app исчезнет из root.
Ответить с цитированием
  #4 (permalink)  
Старый 13.12.2015, 08:18
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

Сообщение от madCoder
ты перезаписываешь скрытое свойство __proto__
Ничего он там не перезаписвает
Ответить с цитированием
  #5 (permalink)  
Старый 13.12.2015, 08:27
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

кстати, даже в нэйтив подобные вещи есть
alert(window == window.window)
Ответить с цитированием
  #6 (permalink)  
Старый 13.12.2015, 15:06
Интересующийся
Отправить личное сообщение для madCoder Посмотреть профиль Найти все сообщения от madCoder
 
Регистрация: 01.12.2015
Сообщений: 10

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

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


console.log(app)
Ответить с цитированием
  #7 (permalink)  
Старый 13.12.2015, 15:41
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

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

Если так рассуждать, мы постояннно только и делаем что перезаписываем разные всякие прото.
Ответить с цитированием
  #8 (permalink)  
Старый 13.12.2015, 15:56
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от 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);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 13.12.2015 в 15:59.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка на болок внутри div'а lookoil Элементы интерфейса 2 03.08.2015 00:05
Как сделать, чтобы скрипт работал с jQuery последней версии? Tass jQuery 2 19.01.2015 12:22
Подскажите как посчитать элементы списков и для каждого списка назначить свои парамет romanpan2 jQuery 7 24.11.2014 19:08
Нужен скрипт Samfer Работа 6 08.04.2012 14:26
Подскажите по CSS меню Александр_1988 Элементы интерфейса 1 17.05.2010 11:58