2015-12-16 6 views
5

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

var myObject = { 
    a:2 
    }; 

    Object.getOwnPropertyDescriptor(myObject, "a"); 

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

myObject.getOwnPropertyDescriptor 

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

Я правильно понимаю это и почему метод Object не на всех прототипах?

+0

Мы не сможем сообщить вам, почему было принято конструктивное решение, если только один из нас не был членом комитета, который разработал язык. Мы можем только догадываться, что не подходит для переполнения стека. Но, как показывают существующие ответы, мы можем сказать вам, что вы правильно понимаете. –

ответ

2

это не является частью прототипа объекта ... это метод

Вы совершенно правы. Это может быть немедленно проверено в консоли JS:

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

В более строго объектно-ориентированном языке, вы могли бы назвать getOwnPropertyDescriptor статическим метод. Более правильно, это не часть цепи прототипов.

+0

Это просто проблема дизайна? Почему люди javascript не помещали все под прототипом, когда они вначале разрабатывали Object? – user3502374

+0

«Почему люди с javascript не делали X?» это сложный вопрос, в основном связанный с тем, что Брендан Эйх создал javascript через несколько дней. Но, более того, вы не хотите ставить все под прототипом, потому что данный метод может быть не полезным или семантически значимым как часть каждого объекта на этом языке. – Chris

+0

Спасибо и ответ принят. Тем не менее, я просто должен сказать, что, как вещи выглядят прототипными мудрая, мой вновь созданный объект будет сначала смотреть на прототип объекта, а не на Object, поэтому я чувствовал, что я бы поставил все под прототип. – user3502374

1

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

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

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

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