два способа создания объекта в JavaScript - PullRequest
7 голосов
/ 12 июля 2011

Я создаю объект javascript, делая что-то вроде:

function field(name,label){
        this.name = name
        this.label= label;
}

var a = new field("market","Mkt").

Затем я назначаю другой объект.

object.newField = a;

Второй способ сделать это - создать новое свойство напрямую

object.2ndNewField = {
    name: "market2",
    label:"Mkt2"
}

Я пытаюсь читать объекты в других функциях. Они ведут себя по-разному, однако, когда я строю объект, он выглядит нормально. В чем разница между двумя свойствами, которые я создал?

Кстати, есть ли разница в следующем объекте?

 object.2ndNewField = {
        "name": "market2",
        "label":"Mkt2
    }

Ответы [ 2 ]

6 голосов
/ 12 июля 2011

Разница в том, что в первом случае созданный объект наследует от field.prototype затем Object.prototype (то есть его внутренний [[Prototype]] равен field.prototype,чей внутренний [[Prototype]] равен Object.prototype ), где, как и во втором случае, он наследует только от Object.prototype .

Другой способ взглянуть наэто:

object.newField instanceof field; // true
object.newField instanceof Object; // true

object.newField2 instanceof field; // false
object.newField2 instanceof Object; // true

или цепочки наследования:

object.newField  -> field.prototype -> Object.prototype -> null

object.newField2 -> Object.prototype -> null

, где '->' означает «наследуется от».

1 голос
/ 12 июля 2011

Для первого варианта ... Держитесь подальше от использования "нового". Вы можете плохо повлиять на ваше глобальное пространство имен, если «new» используется неправильно или не указывается, когда его следует использовать. Кроме того, вы должны быть осторожны с использованием «this» в некоторых местах вашего кода, поскольку оно может быть связано с чем-то, что вы не думаете, или даже с вашими глобальными данными.

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

Я сделал довольно большую запись и пример здесь о том, как безопасно создавать базовые объекты и использовать наследование. Если вы перейдете по ссылке, вы поймете, почему я не перепечатал все это в этом посте;).

Надеюсь, это поможет ...

...