Как JavaScript создает объект? - PullRequest
       4

Как JavaScript создает объект?

3 голосов
/ 26 октября 2010
function Person(name) {
    this.name = name;
    this.say = function() {
        console.info('I am ' + this.name);
    }
}
var p=new Person('stackoverflow');

Кто-то скажет мне, что приведенные выше коды равны:

function Person(name) {
    this.name = name;
    this.say = function() {
        console.info('I am ' + this.name);
    }
}

var p={};
Person.call(p,'stackoverflow');

Это правда?

Если так, как насчет прототипа?Каждый объект в javascripte владеет прототипом, а цепочка прототипов содержит информацию об объектах. Интересно, этот прототип что-то делает или нет.он вызывает какой-то встроенный метод суперкласса Person?

Кстати, я хочу знать, что делает синтаксис var p=new Person('stackoverflow');?


----------------- обновление ------------------

function Person(name) {
    this.name = name;
}
Person.prototype.say = function() {
    console.info('I am ' + this.name);
}

Как насчет, если я положу определение слова внутрифункция человека:

function Person(name) {
    this.name = name;
    Person.prototype.say = function() {
        console.info('I am ' + this.name);
    }
}

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

код:

var p=new Person('stackoverflow');

создает новый экземпляр класса Person. Вы должны помнить, что классы в javascript являются функциями, поэтому при вызове:

Person.call(p,'stackoverflow');

Вы просто вызываете функцию Person и привязываете ее к объекту p (это означает, что в контексте функции this будет ссылаться на объект p). Эти фрагменты кода делают то же самое, за исключением того факта, что первый является экземпляром класса, поэтому, если вы обновите объект-прототип человека, его свойства будут обновлены.

В любом случае ситуация меняется при заполнении объекта-прототипа функции Person:

Person.prototype={test:"test"}

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

0 голосов
/ 26 октября 2010

Ну вообще-то

var p=new Person('stackoverflow');

эквивалентно:

var p={};
p.__proto__ = Person.prototype;
Person.call(p,'stackoverflow');

за исключением того, что __proto__ не является стандартным JavaScript (но поддерживается некоторые реализации).

...