Чаму гэты JS-код не дзейнічае?

Ніжэй код адрэзала выдае памылку TypeError: myObj.prototype не вызначана . Можа хто-небудзь растлумачыць мне, чаму?

Why there is no prototype for new Object() & object literals as specified below?

var myObj = {
    a : "This is a",
    b : "This is b"
}

myObj.prototype.c= "This is c"; //TypeError: myObj.prototype is undefined

Калі гэта не дзейнічае падыход, то як я магу дамагчыся гэтага?

5
Паглядзіце на Eloquent Javascript .
дададзена аўтар Alberto De Caro, крыніца
Гэта павінна быць проста myObj.c = "Foo";
дададзена аўтар epascarello, крыніца
Вы можаце атрымаць прататып з асобніка з Object.getPrototypeOf:
дададзена аўтар James Gaunt, крыніца

6 адказы

У больш ранніх версіях ECMAScript вы не маглі атрымаць прамы доступ да правобразу аб'ектаў; кнопку Прататып ўласцівасць існуе толькі на функцыях, і ён уступае ў гульню, калі яны выкарыстоўваюцца ў якасці канструктараў. Такім чынам, вы можаце зрабіць гэта:

// This is the myObj constuctor
function myObj() {
    this.a = "This is a";
    this.b = "This is b";
}

// Setting a property on the constructor prototype
// All instances will share this
myObj.prototype.c= "This is c";

// Creating a new object and testing its "c" property
var obj = new myObj();
alert(obj.c);//"This is c"

Modern browsers implement Object.getPrototypeOf, which means you can do this:

var myObj = {
    a : "This is a",
    b : "This is b"
}

Object.getPrototypeOf(myObj).c= "This is c";

However, you have to be careful! If you do this, then all objects that exist now and all objects that get created in the future will inherit the property c through their prototype chain!

Гэта адбываецца таму, што myObj мае тып Object , а прататып Object успадкоўваецца ўсё, што з'яўляецца аб'ектам любы тыпу. Гэта прыводзіць да:

var myObj = {
    a : "This is a",
    b : "This is b"
}

Object.getPrototypeOf(myObj).c= "This is c";

var anotherObject = {};

alert(anotherObject.c);//"This is c" -- was it expected?

See it in action.

10
дададзена
Няма! «X.prototype» НЕ «прататыпам х».
дададзена аўтар georg, крыніца
Вядома - калі вы пішаце «someObj.prototype» у JavaScript ня доступ прататыпа аб'екта. <�Код> x.prototype цалкам адрозніваюцца ад рэальнага прататыпа х - гэта проста здараецца мець заблытаная імя.
дададзена аўтар georg, крыніца
Я думаю, што гэты пост тлумачыць гэтае пытанне лепш: stackoverflow.com/a/16666302/989121 (2-я частка)
дададзена аўтар georg, крыніца
@ Thg435: Я не ўпэўнены, я разумею вашу кропку гледжання, не маглі б вы ўдакладніць?
дададзена аўтар Jon, крыніца
@ Thg435: Гэта прадугледжвае, што someObj.prototype існуе для "аб'екта". Але someObj.prototype не існуе наогул, толькі ў адмысловым выпадку, дзе someObj з'яўляецца функцыяй. Дык дзе ж, што пакінуць нас?
дададзена аўтар Jon, крыніца
@ Thg435: Добра, я думаю, я разумею: вы пярэчыце да праходжання <�я> «... не мае прамы доступ да правобразу аб'ектаў, а Прататып існуе ўласцівасць ... », які здаецца, мае на ўвазе, што прататып аб'ектаў, што вы атрымліваеце доступ з кодам <> someFunction.prototype . Калі гэта ён, то я разумею, пярэчанне, але я не ведаю, як палепшыць фармулёўку.
дададзена аўтар Jon, крыніца

Вы павінны спачатку абвясціць карыстацкі аб'ект, як гэта:

function myObj(){
    this.a = "a";
    this.b = "b";
}

то вы можаце дадаць ўласцівасць «с» для гэтага аб'екта наступным чынам

myObj.prototype.c = "c";

як вы можаце бачыць тут http://jsfiddle.net/gwaqm/ уласнасці з поспехам выставіцца.

1
дададзена

У першым прыкладзе вы выкарыстоўвалі Object Notation літарных вызначыць аб'ект з двума ўласцівасцямі: а і б .

prototype is related to the constructor object. If you want to access the prototype of an object, you first start with a constructor function:

function myClass(){
  this.a = "This is a";
}

Затым звярніцеся да свайго прататыпу:

myClass.prototype.pa = "This is prototyped a";

Такім чынам, усе аб'екты, якія ў канчатковым выніку падзяляюць прататып MyCLASS ўспадкуе PA элемент.

0
дададзена

Вы не можаце атрымаць доступ да прататыпу аб'екта з дапамогай прататыпам - гэта будзе проста ўласцівасць называецца прататыпам. Вы не маглі б атрымаць доступ да прататып праз __ прота __ (без ECMA-Standard!)

var myObj = {
    a : "This is a",
    b : "This is b"
}

myObj.__proto__.c= 3;

var test = {};

test.c //-> yields 3

Правільны (сумяшчальны са стандартам) спосаб, аднак было б выкарыстоўваць:

Object.getPrototypeOf(myObj)

або

myObj.constructor.prototype
0
дададзена
я не магу зразумець ваш адказ. confusing.not ясна
дададзена аўтар SivaRajini, крыніца
@Siva што бянтэжыць пра гэта?
дададзена аўтар Christoph, крыніца

Аб'екты ўспадкуюць ўласцівасці прататыпа іх канструктара, а не свайго ўласнага прататыпа.

Вы можаце выкарыстоўваць myObj.constructor.prototype. Але вы не павінны рабіць гэта, таму што ({}). Канструктар == Object. Так што вы змянілі прататып гэтага аб'екта вы змяніць прататып ўсіх аб'ектаў.

Для стварэння аб'екта з канкрэтным выкарыстаннем вопытнага ўзору:

//New method
var proto = ...
var myObj = Object.create(proto);

<�Моцны> АБО </моцны>

//Old method
var proto = ...
var constructor = function(){};
constructor.prototype = proto;
var myObj = new constructor();

You should not use __proto__, because it is bad design and "Non-standard" (See https://developer.mozilla.org/de/docs/JavaScript/Reference/Global_Objects/Object) You can use Object.getPrototypeOf(obj) though

0
дададзена

Калі вы хочаце дадаць ўласцівасць С пасля стварэння аб'екта вы можаце зрабіць

myObj.c = 'This is c';
0
дададзена