Object () və obyekt ədəbiyyatının yeni versiyası arasındakı fərq nədir?

Bir obyekt yaratmaq üçün konstruktor əsasında bu sintaksis arasındakı fərq nədir:

 person = new Object() 

... və bu səciyyəvi sintaksis:

 person = { property1 : "Hello" }; 

JSLint obyekt ədəbiyyatından istifadə etməyi üstün tutsa da, həm də eynidır.

Hansı biri yaxşıdır və niyə?

159
04 янв. 04 yanvar tarixində Ectype tərəfindən təyin olunmuşdur 2011-01-04 23:09 '11 at 11:09 PM 2011-01-04 23:09
@ 9 cavab

Hər ikisi eyni şeyi edirlər (birisi qeyri-adi bir şey etməzsə), ikincisi bir obyekt yaratır və ona bir əmlak əlavə edir. Ancaq hərfi təyinat mənbə kodunda daha az yer tutur. Nə baş verdiyini dəqiq tanıyır, belə ki, new Object() istifadə edərək, həqiqətən daha çox yazın və (nəzəri cəhətdən, JavaScript mühərriki tərəfindən optimallaşdırılmırsa), lazımsız bir funksiya zəngini yerinə yetirirsiniz.

Bunlar

 person = new Object()  -or- person = { property1 : "Hello" }; 

texniki olaraq eyni deyil. Birincisi sadəcə bir obyekt yaradır. İkincisi bir yaradır və mülkü təyin edir. Birincisi eyni olmaq üçün, bir əmlak yaratmaq və təyin etmək üçün ikinci bir addım lazımdır.

Kimsə edə biləcəyi "qeyri-adi bir şey" kölgə ola bilər və ya default olaraq bir Object təyin edir:

 // Don't do this Object = 23; 

Bu çox qeyri-adi hallarda, new Object uğursuz olacaq, lakin {} işləyəcək.

Praktikada new Object istifadə edilməsinə heç bir səbəb yox idi ( {} bu çox qeyri-adi hal deyilsinizsə).

96
04 янв. cavab yanvarın 04- dən kemiller2002 tərəfindən verilir 2011-01-04 23:10 '11 11:10 pm 2011-01-04 23:10

Sizin nümunənizdə olduğu kimi, üsulsuz sadə bir obyekt üçün fərq yoxdur. Ancaq obyektinizə metodlar əlavə etməyə başladığınızda böyük bir fərq var.

Ədəbi yol:

 function Obj( prop ) { return { p : prop, sayHello : function(){ alert(this.p); }, }; } 

Prototip:

border=0
 function Obj( prop ) { this.p = prop; } Obj.prototype.sayHello = function(){alert(this.p);}; 

Hər iki üsul da Obj nümunələrini aşağıdakı kimi yaratmağa imkan verir:

 var foo = new Obj( "hello" ); 

Ancaq sanki, obyektlərin hər instansiyasında sayHello metodunun bir nüsxəsini sayHello . Prototiplə yanaşı, metod obyektin prototipində müəyyənləşdirilir və obyektin bütün nümunələri arasında paylanır. Bir çox obyekt və ya bir çox metodunuz varsa, bir literal yol olduqca böyük yaddaş itkisinə səbəb ola bilər.

203
29 авг. Cavab Rémy DAVID 29 avqustda verilir. 2012-08-29 13:04 '12 at 13:04 2012-08-29 13:04

JavaScript-də biz yeni bir boş obyekti iki şəkildə bildirə bilərik:

 var obj1 = new Object(); var obj2 = {}; 

Mən səhnələrin arxasında necə fəaliyyət göstərməkdə iki fərqli fərq olduğunu düşünmək üçün heç bir şey tapmadım (mənə səhv edərsənsə məni düzəlt, mən bilirəm). Lakin, ikinci üsul (obyekt nüsxəsini istifadə edərək) bir neçə üstünlük təklif edir.

  • Qısa (10 dəqiqə daha dəqiq)
  • Tezliklə obyektlər yaratmaq daha asan və daha strukturlaşdırılmışdır.
  • Hər hansı bir atıcı təsadüfən obyektin üstünə atılsın

Adı və TelNo elementlərini ehtiva edən yeni bir obyekt hesab edin. Yeni Object () konvensiyasından istifadə edərək, onu aşağıdakı kimi yarada bilərik:

 var obj1 = new Object(); obj1.Name = "A Person"; obj1.TelNo = "12345"; 

Expando Properties JavaScript funksiyası bizə bu şəkildə sürətlə yeni üzvlər yaratmağa imkan verir və biz istədiyimizə nail oluruq. Ancaq bu üsul çox strukturlaşdırılmış və ya əhatə olunmamışdır. İnkişaf etməkdə olan xüsusiyyətləri və post-yaratma məsələsinə əsasən, onları yaratarkən iştirakçıları müəyyən etmək istəyiriksə?

Burada obyektin sənədli filmindən istifadə edə bilərsiniz:

 var obj1 = {Name:"A Person",TelNo="12345"}; 

Burada eyni xəttin bir xəttinə və eyni dərəcədə az sayda simvol əldə etdik.

Yuxarıda təsvir edilən obyektin quruluş metodlarının daha da müzakirə oluna bilər: JavaScript və Object Oriented Programming (OOP).

Və nəhayət, obyektin üzərinə dönən nağılın hansı növü var? Bunu qeyri-mümkün hesab edirdiniz? Yaxşı, bu JSFiddle əksini sübut edir. Müəllif ədəbi notasının istifadəsi bizi bu tüfəngdən düşməməyə mane olur.

( Http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/ )

49
01 апр. Apr 01- də James Wiseman tərəfindən verilmiş cavab 2011-04-01 15:30 '11 saat 15:30 'da 2011-04-01 15:30

Node.js istifadə edərək, maşınımda aşağıdakıları işə saldım:

 console.log('Testing Array:'); console.time('using[]'); for(var i=0; i<200000000; i++){var arr = []}; console.timeEnd('using[]'); console.time('using new'); for(var i=0; i<200000000; i++){var arr = new Array}; console.timeEnd('using new'); console.log('Testing Object:'); console.time('using{}'); for(var i=0; i<200000000; i++){var obj = {}}; console.timeEnd('using{}'); console.time('using new'); for(var i=0; i<200000000; i++){var obj = new Object}; console.timeEnd('using new'); 

Bunun nəyin bir uzantısı olduğuna diqqət yetirin: Niyə arr = [] arr = yeni array daha sürətli?

Mənim nəticə belə idi:

 Testing Array: using[]: 1091ms using new: 2286ms Testing Object: using{}: 870ms using new: 5637ms 

belə ki, aydın {} və [] boş obyektlər / diziler yaratmaq üçün yeni istifadə etməkdən daha sürətlidır.

33
29 янв. cavab cənab Rjloura tərəfindən verilir . 2014-01-29 18:56 '14 saat 18:56 2014-01-29 18:56

Burada hər kəs bu ikisinin oxşarlığı barədə danışır. Mən fərqləri qeyd etmək istəyirəm.

  • new Object() istifadə edilməsi başqa bir obyektdən keçməyə imkan verir. Aşkar nəticə isə yeni yaradılmış obyektin eyni linkə qoyulmasından ibarətdir. Burada nümunə kodu:

     var obj1 = new Object(); obj1.a = 1; var obj2 = new Object(obj1); obj2.a // 1 
  • OOP obyektlərində olduğu kimi istifadə obyektlərlə məhdudlaşmır. Digər növlər ona da köçürülə bilər. Funksiya tipi müvafiq olaraq təyin edəcək. Məsələn, əgər bir tamsayı 1 keçirsək, bizim üçün bir ədəd növü obyekti yaradılacaq.

     var obj = new Object(1); typeof obj // "number" 
  • Bir obyekt əlavə edildikdə, yuxarıdakı üsulla ( new Object(1) istifadə edərək yaradılan obyekt new Object(1) obyekt tipinə çevrilir.

     var obj = new Object(1); typeof obj // "number" obj.a = 2; typeof obj // "object" 
  • Nesne obyektin uşağın sinifinin bir nüsxəsidirsə, biz növü dəyişdirmədən bir əmlak əlavə edə bilərsiniz.

     var obj = new Object("foo"); typeof obj // "object" obj === "foo" // true obj.a = 1; obj === "foo" // true obj.a // 1 var str = "foo"; str.a = 1; str.a // undefined 
25
14 дек. Cavab Jermin Bazazian tərəfindən verilmişdir 14 dekabr . 2012-12-14 09:55 '12 at 9:55 2012-12-14 09:55

Əslində JavaScript-də obyektlər yaratmaq üçün bir neçə yol vardır. Yalnız bir obyekt yaratmaq istədiyiniz zaman, yeni operatoru istifadə edərək konstruktor əsasında obyektlər yaratmağın heç bir mənası yoxdur. Nesneyi literal sözdizimindən istifadə edərək bir obyekt yaratmaqla eyni. Ancaq " yeni " istifadə edərək yaradılan konstruktiv obyektlər "prototipik miras haqqında" düşündüyünüz zaman inanılmaz dərəcədə faydalıdır "Sətrin sintaksis ilə yaradılan obyektlərlə miras zəncirini saxlaya bilməzsiniz, lakin bir konstruktor yarada bilərsiniz , prototipinə xüsusiyyətləri və üsulları əlavə edin. Daha sonra bu funksiyanı funksiyanı yeni operatoru istifadə edərək hər hansı bir dəyişənə təyin edərsəniz, bu konstruktor funksiyasının prototipi ilə əlaqəli bütün üsullara və xüsusiyyətlərə giriş əldə edəcək bir obyekti qaytarır.

Konstruktiv funksiyasından istifadə edərək, obyektin yaradılması nümunəsi (aşağıdakı kodun izahına baxın):

 function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.fullname = function() { console.log(this.firstname + ' ' + this.lastname); } var zubaer = new Person('Zubaer', 'Ahammed'); var john = new Person('John', 'Doe'); zubaer.fullname(); john.fullname(); 

İndi şəxs yaratma funksiyasını yaratmaqla istədiyiniz kimi çox obyekt yaratmaq və onların hamısı tam adını () əvəz edə bilərsiniz.

Qeyd: bu söz , konstruktor funksiyası daxilində boş bir obyektə istinad edir və yeni operatoru istifadə edən şəxsdən yeni bir obyekt yaratdığınız zaman avtomatik olaraq bu söz ilə əlaqəli bütün xüsusiyyətləri və metodları ehtiva edən bir obyekti qaytarır. Bu obyekt, ehtimal ki, prototip ilə əlaqəli üsulları və xüsusiyyətləri devralır. İnsanın konstruktiv funksiyaları (bu yanaşmanın əsas üstünlüyü).

Yeri gəlmişkən, obyektin sintaksisinə eyni funksiyanı almaq istəyərsinizsə, aşağıda göstərildiyi kimi, bütün obyektlər üçün tam ad () yaratmaq lazımdır:
 var zubaer = { firstname: 'Zubaer', lastname: 'Ahammed', fullname: function() { console.log(this.firstname + ' ' + this.lastname); } }; var john= { firstname: 'John', lastname: 'Doe', fullname: function() { console.log(this.firstname + ' ' + this.lastname); } }; zubaer.fullname(); john.fullname(); 

Nəhayət, əgər sən indi niyə obyektin əvəzinə konstruktiv yanaşmanı istifadə etməyimi soruşarsan :

Prototip mirasçılığı son dərəcə faydalı və güclü ola biləcək sadə bir miras zəncirinə imkan verir.

*** Konstruktor funksiyalarının prototipində müəyyən edilmiş ümumi metodları və xüsusiyyətləri miras alaraq yaddaş saxlayır. Əks halda, bütün obyektlərdə təkrar və təkrar surətlə çıxarmaq lazımdır.

Ümid edirəm bu mənada.

12
Cavab Md verilir . 02 авг. Zubaer Ahammed Aug 02 2016-08-02 17:55 '16 saat 17:55 'da 2016-08-02 17:55

Bundan əlavə, bəzi Javascript kitablarına görə O'Really .... (istinad)

Obyektlərin konstruktorlarından fərqli olaraq, litalsdan istifadə etmək üçün başqa bir səbəb bölgənin həllinin olmamasıdır. Eyni adla yerli bir konstruktor yaratdığınız üçün, tərcüməçi obyektlərin qlobal konstruktorunu tapana qədər obyekt () deyilən yerdən əhatə zəncirini axtarmalıdır.

8
22 февр. Cavab verilir adolfo_isassi 22 fevral. 2013-02-22 21:25 '13 da 21:25 2013-02-22 21:25

ES6 / ES2015 üçün bir fərq tapdım. Nesneyi new Object() ilə əhatə etmədiyin halda oxların qısayol funksiyasının sintaksisindən istifadə edə bilməzsiniz.

 > [1, 2, 3].map(v => {n: v}); [ undefined, undefined, undefined ] > [1, 2, 3].map(v => new Object({n: v})); [ { n: 1 }, { n: 2 }, { n: 3 } ] 

Bu, kompilyatorun {} bracketlər tərəfindən qarışıq olması və n: i bir etiket olduğuna inanır : ifadəsi quruluşu; nöqtəli nöqtə isteğe bağlıdır, ona görə şikayət etmir.

Obyektə başqa bir əmlak əlavə etsəniz, nəhayət bir səhv verir.

 $ node -e "[1, 2, 3].map(v => {n: v, m: v+1});" [1, 2, 3].map(v => {n: v, m: v+1}); ^ SyntaxError: Unexpected token : 
2
14 апр. Apr 14-də Andrei Simionescu tərəfindən verilmiş cavab 2016-04-14 19:56 '16 saat 19:56 'da 2016-04-14 19:56

10 min nüsxə yaratdığınız halda yaddaş istifadə fərqlidir. new Object() yalnız bir nüsxə olacaq və {} 10 min nüsxə saxlayacaq.

-2
13 июня '16 в 12:23 2016-06-13 12:23 Richard Miao tərəfindən verilmiş cavab 13 iyun 'da 12:23' də 2016-06-13 12:23

tags ilə bağlı digər suallar və ya bir sual