Вы получаете первую ошибку ( mammal.prototype не определен ), потому что mammal
является объектом, свойство prototype
добавляется к объектам функции, когда они создал и его следует использовать, когда вы хотите, чтобы функции были конструкторами .
Я думаю, вы путаете это свойство с внутренним свойством [[Prototype]]
.
Свойство [[Prototype]]
может быть установлено только оператором new
через внутреннюю операцию [[Construct]]
.
Это свойство недоступно (хотя есть несколько способов, например, в реализации Mozilla с помощью obj.__proto__;
или нового метода ECMAScript 5 Object.getPrototypeOf
).
По второму вопросу вы получаете эти ошибки, потому что вы создаете новый объект, который наследуется от функции, а не от другого объекта.
А как же:
var mammal = {
color: "brown",
getColor: function(){
return this.color;
},
kindOf: "mammal" // "base" value
};
// ...
var tiger = object(mammal);
tiger.roar = function(){return "roar";}
tiger.kindOf = "predator"; // specific value
В приведенном выше фрагменте все экземпляры, наследуемые от mammal
, будут иметь свойство kindOf
, которое вы сможете изменить позже при создании более конкретных млекопитающих объектов.
Редактировать: В ответ на ваш комментарий, да, сам язык дает вам инструмент, чтобы узнать, что метод Object.prototype.hasOwnProperty
возвращает логический результат, указывающий, является ли объект физически имеет указанное свойство или нет, например:
var obj = {
foo: 'bar'
};
obj.hasOwnProperty('foo'); // true
obj.hasOwnProperty('toString'); // false, inherited from Object.prototype
Вы также можете вызывать этот метод непосредственно на Object.prototype
, поэтому, если кто-то назовет свойство hasOwnProperty
для объекта, он не будет завершен:
Object.prototype.hasOwnProperty.call(obj, 'foo'); // true