Уточнение, необходимое для описания прототипа / объекта и обхода цепочки

Я все еще изо всех сил пытаюсь прочитать «Вы не знаете JS», но у меня появилась хорошая идея (люблю эту серию). Я думаю, что разбираюсь в прототипе, но я наткнулся на код ниже.

   var myObject = {
     a:2
   };

   Object.getOwnPropertyDescriptor(myObject, "a");

И хотя я полностью понимаю результат и его значение, я пытался использовать свое понимание (или его отсутствие) прототипа и хотел сделать ниже.

   myObject.getOwnPropertyDescriptor

Я думал, что он пройдет вверх по цепочке proto до прототипа объекта и получит этот метод, но, как оказалось, в прототипе объекта этого нет (предположим, что это не часть прототипа объекта, как я смотрю вверху документа, по крайней мере, я не рассматриваю его как часть прототипа, и он говорит, что это метод). Поэтому вместо Object.prototype.getOwnPropertyDescriptor я предполагаю, что это просто Object.getOwnPropertyDescriptor.

Правильно ли я это понимаю и по какой причине метод Object не используется во всех прототипах?


person user3502374    schedule 16.12.2015    source источник
comment
Мы не сможем сказать вам, почему было принято дизайнерское решение, если только один из нас не был членом комитета, который разработал язык. Мы можем только догадываться, что не подходит для Stack Overflow. Но, как показывают существующие ответы, мы можем сказать вам, что вы правильно поняли.   -  person Heretic Monkey    schedule 16.12.2015


Ответы (2)


это не часть прототипа Object ... это метод

Вы совершенно правы. В этом сразу можно убедиться в js-консоли:

> Object.getOwnPropertyDescriptor
getOwnPropertyDescriptor() { [native code] }
> Object.prototype.getOwnPropertyDescriptor
undefined

На более строгом языке ООП вы можете вызвать getOwnPropertyDescriptor статический метод. Точнее, это не часть цепочки прототипов.

person Chris    schedule 16.12.2015
comment
Это просто проблема дизайна? Почему люди, работающие с javascript, не поместили все в прототип, когда разрабатывали Object? - person user3502374; 16.12.2015
comment
Почему люди с javascript не сделали X? - сложный вопрос, в основном связанный с тем, что Брендан Эйх построил javascript за несколько дней. Но, что более важно, вы не хотите помещать все в прототип, потому что данный метод может быть бесполезным или семантически значимым как часть каждого объекта на языке. - person Chris; 16.12.2015
comment
Спасибо, ответ принят. Тем не менее, я просто должен сказать, как все выглядит с точки зрения цепочки прототипов, мой вновь созданный объект сначала будет смотреть на прототип объекта, а не на объект, поэтому я чувствовал, что я бы поместил все в прототип. - person user3502374; 16.12.2015
comment
Я настоятельно рекомендую вам немного почитать об ООП. Вот хорошее место, чтобы начать с того, почему статические методы полезны и почему вы не хотите, чтобы все было частью ваших объектов экземпляра: stackoverflow.com/questions/2080150/ - person Chris; 16.12.2015
comment
Спасибо и очень признателен, и да, у меня нет формального обучения ООП (в классическом смысле), поэтому это необходимо. Я их просмотрю. большое спасибо! - person user3502374; 16.12.2015

Фактически Object.getOwnPropertyDescriptor(myObject, "a") вызывает myObject.GetOwnProperty("a"), но это внутренний метод. источник

Мы можем только догадываться, почему это было сделано таким образом, но я думаю, что имеет смысл определить эти служебные функции как методы объекта Object вместо того, чтобы делать их наследуемыми через Object.prototype.

Более ясным примером может быть Object.keys метод. Если бы это было Object.prototype.keys, это доставляло бы проблемы каждый раз, когда мы хотели создать var inMyPocket = { keys : true }. Итак, теперь, чтобы надежно перечислить keys объекта, нам нужно будет использовать Object.prototype.keys.call( inMyPocket ), потому что мы не могли быть уверены, относится ли inMyPocket.keys() к методу прототипа или было переопределено.

person pawel    schedule 16.12.2015