2015-03-11 4 views
0
function Person(name) { 
    this.name = name; 
} 

Person.prototype = { 
    sayName: function() { 
    console.log(this.name); 
    }, 

toString: function() { 
    return "[Person " + this.name + "]"; 
    } 
}; 

Когда я передаю объектный литерал в прототипе, он меняет свойство конструктора, так что теперь он указывает на Object вместо Person. Почему так ? PLS кто-то объясняет.Передача объекта литерала в конструкторе изменений прототипа?

ответ

1

Вы только что установили Person.prototype. Объект constructor - Object, поэтому конструктор Person также становится Object. Чего ты ожидал?

Вы можете установить свойства один на один, или вы можете просто добавить обратно свойство конструктора:

function Person(name) { 
    this.name = name; 
} 

Person.prototype = { 
    sayName: function() { 
    console.log(this.name); 
    }, 

toString: function() { 
    return "[Person " + this.name + "]"; 
    }, 

    constructor: Person 
}; 

Как прокомментировал TravisJ, вероятно, было бы лучше, чтобы установить его с помощью Object.defineProperty, так что мы можем установите перечислимость в false, как и по умолчанию.

Object.defineProperty(Person.prototype, 'constructor', { 
    configurable: true, 
    writable: true, 
    enumerable: false, // this is the default; including as an example 
    value: Person 
}); 
+0

+1 для вашего анализа - однако было бы лучше включить конструктор, используя Object.defineProperty, чтобы флаг enum мог быть установлен как false, поскольку он по умолчанию. –

+1

Хорошая идея. Обновлено. – Scimonster

0

Прототип по умолчанию указывает на объект, чье свойство (named constructor) является именем вызываемой функции.

Это свойство в основном сообщает, с какой функцией или родителем создается новый объект.

Когда вы перезаписываете его литералом произвольного объекта, эта информация теряется. Обычно, когда свойство не найдено, он ищет цепочку прототипов и в этом случае находит свойство конструктора полностью в «объекте». Вы можете добавить свойство конструктора обратно в свой литерал. Таким образом, поиск останавливается на новом объект, который вы создали.

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