Подтвердить что ты не робот

Почему прототип undefined

Я знал, что это было спрошено сотни раз, однако я не могу понять концепцию prototype

Здесь мой пример script

var config = {
  writable: true,
  enumerable: true,
  configurable: true
};

var defineProperty = function(obj, name, value) {
  config.value = value;
  Object.defineProperty(obj, name, config);
}


var man= Object.create(null);
defineProperty(man, 'sex', "male");

var person = Object.create(man);
person.greet = function (person) {
    return this.name + ': Why, hello there, ' + person + '.'
}
var p=Object.getPrototypeOf(person);
alert(p.sex);//shows male
person.prototype.age=13;//why there is a error said the prototype is undefined? I thought it supposed be man object...

var child=function(){}
child.prototype.color="red";//why this line doesn't show error? both child and person are an object . 

alert(child.prototype.color);//shows red

var ch=Object.getPrototypeOf(child);

alert(ch.color);//why it is undefined? it is supposed red.

Надеюсь, вы можете мне помочь... спасибо.

Обновлено:

Спасибо, ребята, любезную помощь. На основании ответа Elclanrs. Ниже я узнал.

Function является одним из встроенных объектов в javascript. объект функции создания 3-го типа равен.

var function_name = new Function(arg1, arg2, ..., argN, function_body)
function function_name(arg1, arg2, ..., argN)
{
...
}
var function_name=function(arg1, arg2, ..., argN)
{
...
}

Итак, создайте цепочку прототипов, мы должны создать функцию, а затем вызвать ее с помощью нового ключевого слова.

Function.prototype - ссылка на объект Все функции prototype.

Приветствия

4b9b3361

Ответ 1

Я думаю, вы можете смешивать концепции. Сначала попробуйте понять концепцию прототипов с классическим наследованием прототипов, затем вы можете получить все новые вещи Object.

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

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

Имея это в виду, вы можете расширить собственные объекты или создать свои собственные новые прототипы. Это похоже на понятие классов, но гораздо более мощное на практике.

Как и в вашем примере, вы можете написать цепочку прототипов следующим образом:

// Very basic helper to extend prototypes of objects
// I'm attaching this method to the Function prototype
// so it'll be available for every function
Function.prototype.inherits = function(parent) {
  this.prototype = Object.create(parent.prototype);
}

// Person constructor
function Person(name, age, sex) {
  // Common to all Persons
  this.name = name;
  this.age = age;
  this.sex = sex;
}

Person.prototype = {
  // common to all Persons
  say: function(words) {
    return this.name +'says: '+ words;
  }
};

// Student constructor   
function Student(name, age, sex, school) {
  // Set the variables on the parent object Person
  // using Student as a context.
  // This is similar to what other laguanges call 'super'
  Person.call(this, name, age, sex);
  this.school = school; // unique to Student
}

Student.inherits(Person); // inherit the prototype of Person

var mike = new Student('Mike', 25, 'male', 'Downtown'); // create new student

console.log(mike.say('hello world')); //=> "Mike says: hello world"

В новой версии JavaScript (прочитайте EcmaScript) они добавили новые способы борьбы с объектами и расширения их. Но концепция, немного отличающаяся от наследования классического прототипа, кажется более сложной, и некоторые дополнительные знания о том, как работает JS под ними, помогут понять, как это работает, а также не работают в старых браузерах. Поэтому я предлагаю вам начать с классического шаблона, для которого вы найдете точную и изобильную информацию в Интернете.

Ответ 2

Свойство prototype существует только для функций, а person не является функцией. Это a object.

Вот что происходит:

var man = Object.create(null);         // man (object) -> null
man.sex = "male";

var person = Object.create(man);       // person (object) -> man (object) -> null
person.greet = function () { ... };

var p = Object.getPrototypeOf(person); // man (object) -> null
alert(p.sex);                          // p is the same object as man

person.prototype.age = 13;             // person doesn't have a prototype

var child = function () {};            // child (function) -> Function.prototype
                                       // -> Object.prototype -> null
child.prototype.color = "red";         // child has a prototype

var ch = Object.getPrototypeOf(child); // Function.prototype

alert(ch.color);                       // ch is not the same as color.prototype
                                       // ch is Function.prototype

Для получения дополнительной информации я предлагаю вам прочитать этот ответ: fooobar.com/info/85508/...

Изменить:. Объяснить, что происходит в нескольких словах:

  • Все в JavaScript - это объект, кроме примитивных значений (логические значения, числа и строки) и null и undefined.

  • Все объекты имеют свойство [[proto]], которое не доступно программисту. Однако большинство движков делают это свойство доступным как __proto__.

  • Когда вы создаете объект типа var o = { a: false, b: "something", ... }, тогда o.__proto__ есть Object.prototype.

  • Когда вы создаете объект типа var o = Object.create(something), тогда o.__proto__ есть something.

  • Когда вы создаете объект типа var o = new f(a, b, ...), тогда o.__proto__ есть f.prototype.

  • Когда JavaScript не может найти свойство на o, он ищет свойство на o.__proto__, а затем o.__proto__.__proto__ и т.д., пока он не обнаружит, что свойство или прото-цепочка заканчивается на null (в в этом случае это свойство undefined).

  • Наконец, Object.getPrototypeOf(o) возвращает o.__proto__, а не o.prototype - __proto__ существует для всех объектов, включая функции, но prototype существует только для функций.