Javascript Прататыпы, аб'екты, канструктар ?? я блытаюся

Я прайшоў праз шмат перапаўненнем стэка пытанне, які меў апісанне, але я сур'ёзна знайшоў іх вельмі заблытаным. Тое, што я хачу, гэта простае тлумачэнне, калі ласка, не глядзіце спасылку.

Я зусім заблытаўся, цалкам перамяшаныя паміж:

    <�Літый> <�р> Прататыпы, </р>
  • Аб'екты

  • <�р> Канструктар

Я зрабіў шмат даследаванняў, але я знайшоў іх вельмі складана.

Любое простае тлумачэнне ??

3
Гэта занадта вялікае пытанне для фармату StackOverflow. Вам трэба будзе разарваць вашы пытанні ў чымсьці меншым. ААП ў JavaScript займае каля кнігі, каб растлумачыць, і проста выкарыстоўваць прататып займае па меншай меры цэлы раздзел. Ці ёсць нешта канкрэтнае пра прататыпах, якія не маюць сэнсу?
дададзена аўтар MatthewMartin, крыніца
Вы калі-небудзь гугле іх? Прачытайце гэта .
дададзена аўтар NINCOMPOOP, крыніца
Вы павінны быць больш канкрэтнымі, што менавіта гэта, што вы не разумееце. У адваротным выпадку гэта вельмі цяжка зрабіць што-небудзь, акрамя паўтарэння таго, што кажуць ўсюды.
дададзена аўтар JJJ, крыніца
Я мяркую, што час, каб прачытаць добрую кнігу JS. См JS старонку ў StackOverflow [ stackoverflow.com/tags/javascript/info] для спасылак
дададзена аўтар closure, крыніца
У чым розніца паміж прататыпам і канструктарам?
дададзена аўтар user2412575, крыніца
У чым розніца паміж прататыпам і канструктарам?
дададзена аўтар user2412575, крыніца
У чым розніца паміж прататыпам і канструктарам?
дададзена аўтар user2412575, крыніца
Так, проста пачакайце 2 min.i будзе спрашчаць пытанне
дададзена аўтар user2412575, крыніца
Так, проста пачакайце 2 min.i будзе спрашчаць пытанне
дададзена аўтар user2412575, крыніца
Так, проста пачакайце 2 min.i будзе спрашчаць пытанне
дададзена аўтар user2412575, крыніца
да !! я прайшоў праз шмат з іх, я азнаёмілася з suyntax, але я атрымаў din`t канцэпцыю старанна, Evrything ўсё яшчэ вельмі цьмянае ў маёй галаве
дададзена аўтар user2412575, крыніца

7 адказы

Добра, беглы тур:

аб'екты

An object is a thing that has properties. Properties have names and values. The names are always strings (although we can write them without quotes most of the time), and the values can be anything JavaScript supports: Numbers, strings, booleans, null, undefined, or references to аб'екты.

Такім чынам:

var a = {
    propertyName: "property value"
};

a is a variable referring to an object, which has a property named propertyName, whose value is the string "property value".

прататыпы

Месца (скажам, OBJ ) можа мець іншы аб'ект (напрыклад, р ) "за" гэта, дзе р прадастаўляе OBJ яго ўласцівасць, калі OBJ мае сваё ўласнае ўласцівасць з дадзеным імем. <�Код> р гэта Прататып аб'ект OBJ . Гэта прасцей за ўсё зразумець на прыкладзе:

// Let's create an object `p` with a couple of properties, `x` and `y`
// This syntax is called an "object initializer" (aka "object literal")
var p = {
    x: "x on p",
    y: "y on p"
};

// Now, we'll create a new object, `obj`, using `p` as its prototype
var obj = Object.create(p);

// And that means if we ask `obj` for a property called `x`, since it doesn't
// have its **own** `x`, it asks `p` for it. (And the same with `y`)
console.log(obj.x);//"x on p"
console.log(obj.y);//"y on p"

// But we can give `obj` its *own* `x` instead if we want
obj.x = "x on obj";
console.log(obj.x);//"x on obj"
console.log(obj.y);//"y on p"

// Doing that to `obj` had no effect on `p`
console.log(p.x);//"x on p"
console.log(p.y);//"y on p"

A very, very important aspect of прататыпы is that the connection between the аб'екты is live. So if obj doesn't have a y property, every time we ask obj for y it goes and asks p. And so if we change p's value for y, that change shows up if we ask obj for it:

var p = {
    x: "x on p",
    y: "y on p"
};

var obj = Object.create(p);

console.log(obj.y);//"y on p"

p.y = "updated y on p";

console.log(obj.y);//"updated y on p"

Гэта <�моцны> жыць <�моцны /> сувязь з'яўляецца жыццёва важнай рэччу. Такім чынам, яшчэ раз, падумайце пра гэта так: Мы задаць OBJ для ўласцівасці у і OBJ кажа: «Я ня мае ўласныя, так што я пайду прасіць р для яго і даць вам, што «.

Заўвага: Object.create функцыя Я выкарыстоўваю для стварэння OBJ з'яўляецца новым, як ECMAScript5 (абнаўленне спецыфікацый ад пару гадоў таму). Мы вернемся да іншага, каб гэты аб'ект прататып далей ўніз.

Прататып для аб'екта ў дадзены момант ужо ўсталёўваны пры стварэнні аб'екта, і не можа быць зменены (я не мог памяняць у д замест р вышэй пасля стварэння <�код > OBJ ). Вышэй я выкарыстоўваю Object.create , каб зрабіць гэта (і ніжэй мы будзем казаць пра функцыі канструктара). Да ECMAScript5 (ES5), не было ніякага стандартнага спосабу, каб атрымаць прататып аб'екта. ES5 дае нам магчымасць зрабіць гэта цяпер, званы Object.getPrototypeOf , але па-ранейшаму не прапаноўвае спосаб змяніць яго. Наступная версія, ES6, будзе прымаць рэчы крыху далей.

функцыі

функцыі are units of code that do things. функцыі are also аб'екты, and so they can have properties, although in practice it's relatively rare to use properties on функцыі (other than call and apply, which we don't need to talk about here).

Вы можаце абвясціць функцыі:

function foo() {
}

... ці вы можаце стварыць з дапамогай выразы :

// An anonymous -- unnamed -- function assigned to variable `foo`
var foo = function() {
};

// A function named `f` assigned to variable `foo`
var foo = function f() {
};

Пасведчанні і выразы розныя. аб'явы функцый ацэнены перад любым крокам за крокам код у тым жа аб'ёме выконваюцца. Функцыянальныя выразы вылічаюцца, як яны сустракаюцца ў кодзе крок за крокам, як і ўсе іншыя выразы. (Людзі часам называюць гэта «грузапад'ёмным», таму што гэта азначае, што ў рэчаіснасці, нават калі аб'ява функцыі знаходзіцца ў ніжняй частцы рамкі, гэта адбываецца, як калі б ён быў знята - ўзняў. - у верхнюю частку)

функцыі can have arguments:

// `a` and `b` are arguments
function sum(a, b) {
    console.log(a + b);
}

І яны могуць мець вяртаюцца значэння:

function sum(a, b) {
    return a + b;
}
console.log(sum(1, 2));//"3"

Калі функцыя не вяртае нешта іншае, то вынік выкліку функцыі з'яўляецца значэнне не вызначана .

метады

JavaScript doesn't have метады. It only has функцыі — but that's all it really needs. But if you have a function assigned to an object property, and you call that function as part of an expression retrieving the property from the object, then something happens that makes JavaScript seem to have метады: The this keyword refers to that object within the function call. Again, an example works wonders:

// A blank object
var obj = {};

// Lets put a function on it as a property
obj.foo = function() {
    console.log("this is obj? " + this === obj);
};

// Let's call that function
obj.foo();//"this is obj? true"

Яшчэ на маім блогу:

канструктары

Constructor функцыі are used with the new keyword, and they're one of the ways you give an object a prototype. When you call a function via new, a new object is created, and assigned a prototype from the function's prototype property:

function Foo() {
}
Foo.prototype.x = "x on Foo.prototype";

var obj = new Foo();
console.log(obj.x);//"x on Foo.prototype"

Every function automatically has a prototype property, even though of course we don't use the vast majority of функцыі as канструктары.

Важна адзначыць тут: Элемент прататыпам ўласцівасць функцыі проста сумныя старыя уласнасці. Гэта не прататып якога-небудзь аб'екта да/калі гэтая функцыя не выклікаецца з дапамогай новы аператара. <�Код> новы Аператар выкарыстоўвае кнопку Прататып ўласцівасць функцыі, каб усталяваць прататып новага аб'екта пры выкліку функцыі праз новы , але гэта ўсё.

It's worth mentioning that until ES5, constructor функцыі like the above were the only way you could create an object with a given prototype. But with ES5, we got Object.create, which opened up more patterns for how to use JavaScript. (It was always possible to create your own Object.create, by using a temporary function, and in fact that's exactly what some people did.) Some people don't like using the new keyword and the prototype property, they prefer to use a "builder" pattern where you just call a function and get back an object. JavaScript is so flexible that you can do that.


больш Даследаваць

11
дададзена
Вельмі высокую якасць і добры адказ. Адзінае, што я думаю, што тут хапае больш спасылак на месцах, як MDN і спецыфікацыя.
дададзена аўтар Benjamin Gruenbaum, крыніца
@jayeshjain: Дзякуй! Я рады, што дапамог!
дададзена аўтар T.J. Crowder, крыніца
@BenjaminGruenbaum: Што я думаў?! Гатова, і дзякуй.
дададзена аўтар T.J. Crowder, крыніца
Fianlly !!! я атрымаў тое, што я хацеў, THx @ T.J.Crowder, у г генія, зрабілі гэта так проста так
дададзена аўтар user2412575, крыніца

Добра, беглы тур:

аб'екты

An object is a thing that has properties. Properties have names and values. The names are always strings (although we can write them without quotes most of the time), and the values can be anything JavaScript supports: Numbers, strings, booleans, null, undefined, or references to аб'екты.

Такім чынам:

var a = {
    propertyName: "property value"
};

a is a variable referring to an object, which has a property named propertyName, whose value is the string "property value".

прататыпы

Месца (скажам, OBJ ) можа мець іншы аб'ект (напрыклад, р ) "за" гэта, дзе р прадастаўляе OBJ яго ўласцівасць, калі OBJ мае сваё ўласнае ўласцівасць з дадзеным імем. <�Код> р гэта Прататып аб'ект OBJ . Гэта прасцей за ўсё зразумець на прыкладзе:

// Let's create an object `p` with a couple of properties, `x` and `y`
// This syntax is called an "object initializer" (aka "object literal")
var p = {
    x: "x on p",
    y: "y on p"
};

// Now, we'll create a new object, `obj`, using `p` as its prototype
var obj = Object.create(p);

// And that means if we ask `obj` for a property called `x`, since it doesn't
// have its **own** `x`, it asks `p` for it. (And the same with `y`)
console.log(obj.x);//"x on p"
console.log(obj.y);//"y on p"

// But we can give `obj` its *own* `x` instead if we want
obj.x = "x on obj";
console.log(obj.x);//"x on obj"
console.log(obj.y);//"y on p"

// Doing that to `obj` had no effect on `p`
console.log(p.x);//"x on p"
console.log(p.y);//"y on p"

A very, very important aspect of прататыпы is that the connection between the аб'екты is live. So if obj doesn't have a y property, every time we ask obj for y it goes and asks p. And so if we change p's value for y, that change shows up if we ask obj for it:

var p = {
    x: "x on p",
    y: "y on p"
};

var obj = Object.create(p);

console.log(obj.y);//"y on p"

p.y = "updated y on p";

console.log(obj.y);//"updated y on p"

Гэта <�моцны> жыць <�моцны /> сувязь з'яўляецца жыццёва важнай рэччу. Такім чынам, яшчэ раз, падумайце пра гэта так: Мы задаць OBJ для ўласцівасці у і OBJ кажа: «Я ня мае ўласныя, так што я пайду прасіць р для яго і даць вам, што «.

Заўвага: Object.create функцыя Я выкарыстоўваю для стварэння OBJ з'яўляецца новым, як ECMAScript5 (абнаўленне спецыфікацый ад пару гадоў таму). Мы вернемся да іншага, каб гэты аб'ект прататып далей ўніз.

Прататып для аб'екта ў дадзены момант ужо ўсталёўваны пры стварэнні аб'екта, і не можа быць зменены (я не мог памяняць у д замест р вышэй пасля стварэння <�код > OBJ ). Вышэй я выкарыстоўваю Object.create , каб зрабіць гэта (і ніжэй мы будзем казаць пра функцыі канструктара). Да ECMAScript5 (ES5), не было ніякага стандартнага спосабу, каб атрымаць прататып аб'екта. ES5 дае нам магчымасць зрабіць гэта цяпер, званы Object.getPrototypeOf , але па-ранейшаму не прапаноўвае спосаб змяніць яго. Наступная версія, ES6, будзе прымаць рэчы крыху далей.

функцыі

функцыі are units of code that do things. функцыі are also аб'екты, and so they can have properties, although in practice it's relatively rare to use properties on функцыі (other than call and apply, which we don't need to talk about here).

Вы можаце абвясціць функцыі:

function foo() {
}

... ці вы можаце стварыць з дапамогай выразы :

// An anonymous -- unnamed -- function assigned to variable `foo`
var foo = function() {
};

// A function named `f` assigned to variable `foo`
var foo = function f() {
};

Пасведчанні і выразы розныя. аб'явы функцый ацэнены перад любым крокам за крокам код у тым жа аб'ёме выконваюцца. Функцыянальныя выразы вылічаюцца, як яны сустракаюцца ў кодзе крок за крокам, як і ўсе іншыя выразы. (Людзі часам называюць гэта «грузапад'ёмным», таму што гэта азначае, што ў рэчаіснасці, нават калі аб'ява функцыі знаходзіцца ў ніжняй частцы рамкі, гэта адбываецца, як калі б ён быў знята - ўзняў. - у верхнюю частку)

функцыі can have arguments:

// `a` and `b` are arguments
function sum(a, b) {
    console.log(a + b);
}

І яны могуць мець вяртаюцца значэння:

function sum(a, b) {
    return a + b;
}
console.log(sum(1, 2));//"3"

Калі функцыя не вяртае нешта іншае, то вынік выкліку функцыі з'яўляецца значэнне не вызначана .

метады

JavaScript doesn't have метады. It only has функцыі — but that's all it really needs. But if you have a function assigned to an object property, and you call that function as part of an expression retrieving the property from the object, then something happens that makes JavaScript seem to have метады: The this keyword refers to that object within the function call. Again, an example works wonders:

// A blank object
var obj = {};

// Lets put a function on it as a property
obj.foo = function() {
    console.log("this is obj? " + this === obj);
};

// Let's call that function
obj.foo();//"this is obj? true"

Яшчэ на маім блогу:

канструктары

Constructor функцыі are used with the new keyword, and they're one of the ways you give an object a prototype. When you call a function via new, a new object is created, and assigned a prototype from the function's prototype property:

function Foo() {
}
Foo.prototype.x = "x on Foo.prototype";

var obj = new Foo();
console.log(obj.x);//"x on Foo.prototype"

Every function automatically has a prototype property, even though of course we don't use the vast majority of функцыі as канструктары.

Важна адзначыць тут: Элемент прататыпам ўласцівасць функцыі проста сумныя старыя уласнасці. Гэта не прататып якога-небудзь аб'екта да/калі гэтая функцыя не выклікаецца з дапамогай новы аператара. <�Код> новы Аператар выкарыстоўвае кнопку Прататып ўласцівасць функцыі, каб усталяваць прататып новага аб'екта пры выкліку функцыі праз новы , але гэта ўсё.

It's worth mentioning that until ES5, constructor функцыі like the above were the only way you could create an object with a given prototype. But with ES5, we got Object.create, which opened up more patterns for how to use JavaScript. (It was always possible to create your own Object.create, by using a temporary function, and in fact that's exactly what some people did.) Some people don't like using the new keyword and the prototype property, they prefer to use a "builder" pattern where you just call a function and get back an object. JavaScript is so flexible that you can do that.


больш Даследаваць

11
дададзена
Вельмі высокую якасць і добры адказ. Адзінае, што я думаю, што тут хапае больш спасылак на месцах, як MDN і спецыфікацыя.
дададзена аўтар Benjamin Gruenbaum, крыніца
@BenjaminGruenbaum: Што я думаў?! Гатова, і дзякуй.
дададзена аўтар T.J. Crowder, крыніца
@jayeshjain: Дзякуй! Я рады, што дапамог!
дададзена аўтар T.J. Crowder, крыніца
Fianlly !!! я атрымаў тое, што я хацеў, THx @ T.J.Crowder, у г генія, зрабілі гэта так проста так
дададзена аўтар user2412575, крыніца

JavaScript гэта мова сцэнарыяў, які выкарыстоўваецца ў вэб-прыкладаннях, каб зрабіць вэб-старонкі дынамічнымі. Гэтая мова дазваляе апрацоўваць дзеянні карыстальніка пры апрацоўцы падзей на паказу на старонцы элементаў .... Акрамя таго, ён выкарыстоўваецца для змены змесціва на вэб-старонкі, грунтуючыся на стане ...

Функцыя метаду (або) з'яўляецца праграмнай канструкцыя выкарыстоўваецца ў JavaScript для заданні логікі. Вы змесціць вашу неабходную логіку ў метадзе, і вы будзеце выклікаць яго з вэб-старонкі на любым выпадку ...

Там няма Канструктары у JavaScript ...

Там будуць няяўныя і пэўны карыстальнікам аб'ектаў JavaScript ... Няяўныя аб'екты ўключаюць у сябе дату, масіў і г.д. ...

Гэта толькі асноўныя абстрактныя .. вам неабходна прытрымлівацца небудзь вэб-сайтаў (або) кнігі, каб даведацца значна больш пра JavaScript

4
дададзена

JavaScript гэта мова сцэнарыяў, які выкарыстоўваецца ў вэб-прыкладаннях, каб зрабіць вэб-старонкі дынамічнымі. Гэтая мова дазваляе апрацоўваць дзеянні карыстальніка пры апрацоўцы падзей на паказу на старонцы элементаў .... Акрамя таго, ён выкарыстоўваецца для змены змесціва на вэб-старонкі, грунтуючыся на стане ...

Функцыя метаду (або) з'яўляецца праграмнай канструкцыя выкарыстоўваецца ў JavaScript для заданні логікі. Вы змесціць вашу неабходную логіку ў метадзе, і вы будзеце выклікаць яго з вэб-старонкі на любым выпадку ...

Там няма Канструктары у JavaScript ...

Там будуць няяўныя і пэўны карыстальнікам аб'ектаў JavaScript ... Няяўныя аб'екты ўключаюць у сябе дату, масіў і г.д. ...

Гэта толькі асноўныя абстрактныя .. вам неабходна прытрымлівацца небудзь вэб-сайтаў (або) кнігі, каб даведацца значна больш пра JavaScript

4
дададзена

JavaScript гэта мова сцэнарыяў, які выкарыстоўваецца ў вэб-прыкладаннях, каб зрабіць вэб-старонкі дынамічнымі. Гэтая мова дазваляе апрацоўваць дзеянні карыстальніка пры апрацоўцы падзей на паказу на старонцы элементаў .... Акрамя таго, ён выкарыстоўваецца для змены змесціва на вэб-старонкі, грунтуючыся на стане ...

Функцыя метаду (або) з'яўляецца праграмнай канструкцыя выкарыстоўваецца ў JavaScript для заданні логікі. Вы змесціць вашу неабходную логіку ў метадзе, і вы будзеце выклікаць яго з вэб-старонкі на любым выпадку ...

Там няма Канструктары у JavaScript ...

Там будуць няяўныя і пэўны карыстальнікам аб'ектаў JavaScript ... Няяўныя аб'екты ўключаюць у сябе дату, масіў і г.д. ...

Гэта толькі асноўныя абстрактныя .. вам неабходна прытрымлівацца небудзь вэб-сайтаў (або) кнігі, каб даведацца значна больш пра JavaScript

4
дададзена

Вы знаходзіцеся ў поспеху. Там вельмі простае тлумачэнне:

<�Моцны> Крок першы: Стварэнне аб'екта

Дапусцім, вы хочаце, каб круг:

var circle = {};

<�Моцны> Крок другі: Дайце яму некаторыя ўласцівасці

Круг можна зрабіць, дык давайце створым ўласцівасць маляваныя :

circle.draw = function() {
   //drawing logic
};
    <�Літый> Уласцівасць гэта проста пераменная, якая належыць да аб'екта. Пераменная сама па сабе не з'яўляецца уласцівасцю.
  1. Уласцівасці і зменныя могуць займаць якое-небудзь дадзеныя. Функцыі ў JavaScript ўяўляюць сабой дадзеныя.
  2. Калі ўласцівасць мае функцыю гэта называецца метадам.

Таму ў нас ёсць метад, званы маляваныя , які належыць да аб'екта круг .

<�Моцны> Крок трэці: Пашырыць Аб'ект

Цяпер я хачу, мяч і мяч накшталт як круг. Так давайце пашырым круг , каб стварыць шар:

var ball = Object.create(circle);
  1. Тут мы ўзялі аб'ект круг і выкарыстоўваць яго, каб стварыць новы аб'ект з імем шар .
  2. Аб'ект мяч зараз мае ўсе ўласцівасці круг . Такім чынам, мы можам назваць ball.draw .
  3. Аб'ект круг гэта прататып мяч .

<�Моцны> Крок чацвёрты: Дайце яму некаторыя ўласцівасці

Кожны шар мае радыус , так што давайце дамо наша адно:

ball.radius = 5;

<�Моцны> Крок пяты: Стварэнне канструктара

Там праблема тут. Кожны раз, калі я хачу стварыць новы шар Выказваю круг і ўручную вызначыць радыус шара. Замест гэтага я хацеў бы функцыю, каб стварыць шар і даць яму радыус для мяне. Гэтая функцыя называецца канструктар:

function createBall(radius) {
    var ball = Object.create(circle);
    ball.radius = radius;
    return ball;
}

var baseball = createBall(5);
var basketball = createBall(10);

baseball.draw();
basketball.draw();

Гэта ў значнай ступені ўсё, што вам трэба ведаць аб прататыпах, аб'ектах і канструктарах.

Of course there's a lot more explanation but it's too much for one StackOverflow answer. I wrote a blog post on it, and I'm not planning to rewrite the same thing here. You should read my blog. It's worth it: http://aaditmshah.github.io/why-prototypal-inheritance-matters


Edit: Sure, I'll explain what happening in that code: http://cssdeck.com/labs/4ksohwya

Па-першае, пракруціць ўніз да самага канца:

window.addEventListener(
    'load',
    init(null),
    false);

Пры загрузцы старонкі выконваецца INIT :

function init(images) {

    canvas= document.getElementById('s');
    ctx= canvas.getContext('2d');
    canvas.width= window.innerWidth;
    canvas.height=window.innerHeight;

    garden= new Garden();
    garden.initialize(canvas.width, canvas.height, 300);

    lerp(0,2000);

    time= new Date().getTime();
    interval = setInterval(_doit, 30);
}

<�Код> INIT функцыя стварае асобнік Сад ( Сад = новы сад (); ) і выконвае Initialize метад з сад . Ён таксама называе _doit функцыі ў інтэрвалах 30 мілісекунд.

initialize : function(width, height, size)  {
  this.width= width;
  this.height= height;
  this.grass= [];

  for(var i=0; i

<�Код> Initialize метад сад затым стварае некаторыя асобнікі Grass , называе іх Initialize Метады і захоўвае іх у масіве ,

function _doit()    {

  ctx.fillStyle= gradient;
  ctx.fillRect(0,0,canvas.width,canvas.height);
  var ntime= new Date().getTime();
  var elapsed= ntime-time;
  garden.paint( ctx, elapsed );

 //lerp.
  if ( elapsed>nextLerpTime ) {
    lerpindex= Math.floor((elapsed-nextLerpTime)/nextLerpTime);
    if ( (elapsed-nextLerpTime)%nextLerpTime

<�Код> _doit функцыя выклікае фарба функцыі сад , і фарба функцыі сад </код > называе фарба функцыя кожнай травы.


Дык вось ёсць два канструктара:

  1. Grass
  2. Сад

Вось два прататыпа:

  1. Grass.prototype
  2. Garden.prototype

Ўнутры INIT мы ствараем адзін асобнік Сад (гэта адзін аб'ект):

var garden= new Garden();

Ўнутры Initialize метад сад мы ствараем некалькі асобнікаў Grass :

var g= new Grass();

Вось і ўсё.

3
дададзена
Вельмі прыгожа, мне падабаецца, як вы выкарыстоўвалі тэрмін канструктар, каб паказаць функцыю стварэньня аб'екта, і <�я> не функцыя выкарыстоўваючы новы ключавое слова.
дададзена аўтар Benjamin Gruenbaum, крыніца
У JavaScript, то лепш <�б> не , каб выклікаць функцыю канструктара, калі вы не выклікаеце яго з дапамогай новы . «Будаўнік» (або радзей «творца») з'яўляецца лепшым тэрмінам, паколькі спецыфікацыя дае тэрмін «канструктар» пэўны сэнс.
дададзена аўтар T.J. Crowder, крыніца
@AaditMShah: Я разумею, што вы робіце, я проста кажу, што гэта лепш, каб не пераблытаць справы, называючы яго «канструктар», бо язык (праз яго спецыфікацыі) дае гэты тэрмін у спецыфічны </я > (і іншае) значэнне. У мяне няма ніякіх праблем з падыходам. Адна з рэчаў, якія я люблю пра JS, што гэта настолькі гнуткае, вы можаце прыняць больш традыцыйны прататып падыход да стварэння аб'ектаў. Мова можа быць выкарыстаны некалькімі спосабамі, якія я люблю пра гэта.
дададзена аўтар T.J. Crowder, крыніца
@ T.J.Crowder - Я разумею вашу кропку гледжання, але я сумняваюся, што людзі будуць блытацца. Калі вы называеце гэта канструктар, будаўнік або стваральнік у рэшце рэшт, вы павінны зразумець прататып спадчыну. Да таго часу, як вы пішаце разборліва код не мае значэння.
дададзена аўтар Aadit M Shah, крыніца
@ T.J.Crowder я б не даць яму ніякай спецыяльнай этыкеткі на ўсіх. Я проста выкарыстаў тэрмін «канструктар» для зручнасці тлумачэнні. Асабіста я аддаю перавагу выкарыстоўваць <�б> прататып малюнак прототипных спадчыну па канструктара шаблону з прототипного спадчыну , што большасць людзей выкарыстоўваюць. Гэта адна з рэчаў, пра JavaScript, што мне не падабаецца: шаблон канструктар. Гэта праблематычна і хавае праўдзівы ў прататып ўзор. Вы павінны чытаць мой блог, калі ў вас няма. Я паспрабаваў растлумачыць прататып спадчыну, як лепш за ўсё, як я мог. Мабыць Эрык Эліёт з Adobe думаў, што гэта была вялікая артыкул. =)
дададзена аўтар Aadit M Shah, крыніца
@jayeshjain - Дзякуй. Я бачыў спасылку, якую адправіла. Нічога сабе, гэта дзіўная анімацыя. Ва ўсякім выпадку, я абнавіў свой адказ, каб паказаць на канструктары, дасведчаныя ўзоры і аб'екты і растлумачыў, як Initialize і фарба метады называюцца. Надзея, што дапамагае.
дададзена аўтар Aadit M Shah, крыніца
@jayeshjain Канструктары з'яўляюцца функцыямі, якія ствараюць аб'екты. Прыклад вы прывёў толькі два канструктара - Grass і Сад . У JavaScript любая функцыя можа быць выкарыстана ў якасці канструктара, дадаўшы новы перад выклікам функцыі. Такім чынам вар г = новая трава выклікае функцыю Grass у якасці канструктара і вяртае аб'ект, які захоўваецца ў г . Гэты аб'ект г спадчыну ўсё ўласцівасці Grass.prototype які з'яўляецца прататыпам г . <�Код> Initialize з'яўляецца ўласцівасцю прататыпа і, такім чынам, па спадчыне. Гэта не канструктар. Прачытайце гэта: stackoverflow.com/a/8096017/783743
дададзена аўтар Aadit M Shah, крыніца
@jayeshjain - Так, сапраўды. Менавіта так я аддаю перавагу ствараць аб'екты. Скажам, у мяне ёсць аб'ект, для акружнасці наступным чынам: вар круг = {радыус: 5, плошча: функцыя() {вярнуць Math.PI * this.radius * this.radius; }}; . Цяпер я магу выкарыстоўваць circle.area() для вылічэння плошчы круга. Аднак, калі я хачу, каб стварыць яшчэ адзін круг, я проста трэба пашырыць гэтае кола. Мы можам выкарыстоўваць функцыю для гэтага: функцыя CreateCircle (радыус) {вар newCircle = Object.create (круг); newCircle.radius = радыус; вярнуцца newCircle; } . Цяпер я магу стварыць столькі колаў, як я хачу, як гэта: вар мяч = createCirlce (10); . =)
дададзена аўтар Aadit M Shah, крыніца
@jayeshjain - Канструктар заключаны ў тое, што называецца IIFE - ап неадкладна выклікаецца выраз функцыі . Гэта выкарыстоўваецца для інкапсуляцыі прыватнага стану. Так, Grass (з вялікай літары G) з'яўляецца канструктарам і кожная функцыя мае прататып. Такім чынам, Grass.prototype накшталт як constructor.prototype . Аднак варта адзначыць, што вы маглі б мець іншую функцыю Канструктар .
дададзена аўтар Aadit M Shah, крыніца
@AaditMShah: вар г = новая трава (); гэта г канструктар ў гэтым?
дададзена аўтар user2412575, крыніца
@AaditMShah: і мяркую, што калі я не хачу выкарыстоўваць канструктар, і выкарыстоўваючы толькі прататып, было б магчыма стварыць асобнікі і успадкаваць ўласцівасці? я думаю, там create.object прыходзіў гуляць?
дададзена аўтар user2412575, крыніца
@AaditMShah: Duniya Gol Хаі дружа !!! тнх тону чалавек, але калі я турбаваць U яшчэ некалькі разоў не пярэчу !!!
дададзена аўтар user2412575, крыніца
@AaditMShah: чаму канструктар травы заключаны ў (функцыя() {----- калі і ўбачыць яго ў самым пачатку
дададзена аўтар user2412575, крыніца
@AaditMShah: Вы 20, я немогу паверыць, вы WOW !!! Папраўце мяне, калі я памыляюся, 1) --- асобнікі, якія былі створаныя - я магу сказаць, што garden.initialize (canvas.width, canvas.height, 300); гэта канструктар заяву гэтак жа, як аб'яву функцыі? так, дзе гэта defined..is яго асобнік, які быў створаны? 2) --- калі вы бачыце першыя некалькі радкоў кода, Grass = функцыя() {вярнуць гэта; }; няма згаданага вару, як гэта магчыма, што яго не паказвае якую-небудзь памылкі, як няма вару травы = 0; вызначаныя да гэтага? і калі я не памыляюся, што гэта аб'ект, 3) --- калі выкарыстоўваць гэта?
дададзена аўтар user2412575, крыніца
@AaditMShah: правільна ці няправільна !!! grass.prototype = {а: 1, бы: 2} у асноўным constructor.prototype = {а: 1, бы: 2}
дададзена аўтар user2412575, крыніца
@AaditMShah: HII, я спадабаўся ваш адказ і пайшоў праз blog.now я магу сказаць, што я разумею трохі аб прататыпах, канструктару і objects.The спасылцы ніжэй з'яўляецца прыкладам прататыпа падыходу, які вы mentioned.I думаюць, што гэта належны стандарт для напісання любой code.can вы проста скажыце мне, якія з'яўляюцца канструктары, прататыпы і аб'екты ў гэтым кодзе, я абяцаю, я не буду праблемы ў больш. cssdeck.com/labs/4ksohwya ​​ (рэчы, якія трэба паглядзець - функцыя фарбы, ініцыялізаваць і шлях яны называюцца-вы можаце проста праінфармуе мяне пра гэта)
дададзена аўтар user2412575, крыніца

Я мяркую, што я занадта позна, але тут будзе мае 2 цэнта:

<�Моцны> Прататып:

String.prototype.x = "yahoo"

зараз кожны асобнік Радок будзе мець ўласцівасць <�моцны> х .

So be it (new String()).x or "".x both have the value equal to yahoo

Такім чынам, гэта як пашырэнне наканаванага класа.


аб'екты

Усё ў JavaScript, акрамя іншых прымітыўных тыпаў, з'яўляецца аб'ектам.

Аб'ект уяўляе сабой набор пар імя-значэнне, нічога больш, ні менш.

{"a": 0, "b" : 1}

Even an Array is an object in JS with some additional properties & methods.


Functions & Methods

Вось функцыя:

function a() { };

Зараз давайце дамо яму статус метаду ў Масіў :

Array.prototype.a = a;

<�Моцны> Канструктар:

new String()

gets the implementation of String from : String.constructor

Сапраўды гэтак жа код, які вы пішыце ў любой функцыі пераходзіць у гэтую самую функцыю.

0
дададзена
<�Я> "атрымлівае рэалізацыю Радок з: String.constructor " Не, гэта не так, ён атрымлівае яго з Радок і String.prototype . Акрамя таго, я б <�б> моцна не рэкамендую выкарыстоўваць пашырэнне ўласныя тыпаў у якасці прыкладу для таго, як прататыпаў працы.
дададзена аўтар T.J. Crowder, крыніца
@loxxy: Ці не недаацэньваць сябе, ваш expalnation, безумоўна, больш, чым 2 цэнта, прыгожа, коратка і проста !!!
дададзена аўтар user2412575, крыніца