Pengetahuan asas_asas pengaturcaraan berorientasikan objek JavaScript

WBOY
Lepaskan: 2016-05-16 15:45:16
asal
1238 orang telah melayarinya

Fahami semula berorientasikan objek
Untuk menggambarkan bahawa JavaScript ialah bahasa berorientasikan objek sepenuhnya, pertama sekali perlu bermula dengan konsep berorientasikan objek dan membincangkan beberapa konsep dalam berorientasikan objek:

  1. Semuanya adalah objek
  2. Objek mempunyai ciri pengkapsulan dan pewarisan
  3. Objek menggunakan mesej untuk berkomunikasi antara satu sama lain, dan masing-masing mempunyai maklumat yang disembunyikan

Berdasarkan tiga perkara ini, C ialah bahasa separa berorientasikan objek dan separa prosedur, kerana walaupun ia melaksanakan enkapsulasi kelas, pewarisan dan polimorfisme, terdapat fungsi dan pembolehubah global bukan objek. Java dan C# adalah bahasa berorientasikan objek sepenuhnya. Mereka mengatur fungsi dan pembolehubah dalam bentuk kelas supaya mereka tidak boleh wujud tanpa objek. Tetapi di sini fungsi itu sendiri adalah proses, hanya dilampirkan pada kelas tertentu.

Walau bagaimanapun, berorientasikan objek hanyalah konsep atau idea pengaturcaraan, dan ia tidak sepatutnya bergantung pada bahasa tertentu untuk kewujudannya. Sebagai contoh, Java menggunakan pemikiran berorientasikan objek untuk membina bahasanya, dan ia melaksanakan mekanisme seperti kelas, pewarisan, terbitan, polimorfisme dan antara muka. Walau bagaimanapun, mekanisme ini hanyalah satu cara untuk melaksanakan pengaturcaraan berorientasikan objek, tidak perlu. Dengan kata lain, sesuatu bahasa boleh memilih cara yang sesuai untuk melaksanakan orientasi objek berdasarkan ciri-cirinya sendiri. Oleh itu, oleh kerana kebanyakan pengaturcara mula-mula mempelajari atau menggunakan bahasa kompilasi peringkat tinggi seperti Java dan C (walaupun Java adalah separa tersusun dan separa tafsiran, ia secara amnya dijelaskan sebagai bahasa tersusun), mereka secara prasangka menerima istilah "kelas ". Kaedah pelaksanaan berorientasikan objek, jadi apabila mempelajari bahasa skrip, adalah kebiasaan untuk menggunakan konsep dalam bahasa berorientasikan objek berasaskan kelas untuk menilai sama ada bahasa itu adalah bahasa berorientasikan objek atau sama ada ia mempunyai ciri berorientasikan objek. . Ini juga merupakan salah satu sebab penting yang menghalang pengaturcara daripada mempelajari dan menguasai JavaScript secara mendalam.
Malah, bahasa JavaScript melaksanakan pengaturcaraan berorientasikan objek melalui kaedah yang dipanggil prototaip. Mari kita bincangkan perbezaan antara dua kaedah membina dunia objektif, berorientasikan objek berasaskan kelas dan berorientasikan objek berasaskan prototaip.
Perbandingan antara pendekatan berorientasikan objek berasaskan kelas dan berasaskan prototaip
Dalam pendekatan berorientasikan objek berasaskan kelas, objek dijana berdasarkan kelas. Dalam pendekatan berorientasikan objek berasaskan prototaip, objek dibina menggunakan pembina dan prototaip. Berikan satu contoh daripada dunia objektif untuk menggambarkan perbezaan antara dua cara kognisi. Sebagai contoh, apabila sebuah kilang membina kereta, di satu pihak, pekerja mesti merujuk kepada lukisan kejuruteraan dan reka bentuk menetapkan bagaimana kereta itu harus dikeluarkan. Lukisan kejuruteraan di sini adalah seperti kelas dalam bahasa, dan kereta dihasilkan mengikut kelas ini, sebaliknya, pekerja dan mesin (bersamaan dengan pembina) menggunakan pelbagai bahagian seperti enjin, tayar, Stereng (bersamaan dengan setiap atribut; prototaip) membina kereta.
Malah, masih terdapat perdebatan tentang yang mana antara dua kaedah menyatakan idea berorientasikan objek dengan lebih teliti. Tetapi penulis percaya bahawa prototaip berorientasikan objek adalah pendekatan berorientasikan objek yang lebih teliti atas sebab-sebab berikut:
Pertama sekali, penciptaan objek dalam dunia objektif adalah hasil daripada pembinaan objek fizikal lain, dan "lukisan" abstrak tidak boleh menghasilkan "kereta". penciptaan objek adalah Penciptaan entiti
Kedua, mengikut peraturan berorientasikan objek yang paling asas bahawa segala-galanya adalah objek, kelas itu sendiri bukan objek Walau bagaimanapun, pembina dan prototaip dalam kaedah prototaip adalah objek lain melalui kaedah prototaip.
Ketiga, dalam bahasa berorientasikan objek berasaskan kelas, keadaan objek dipegang oleh contoh objek, dan kaedah tingkah laku objek dipegang oleh kelas yang mengisytiharkan objek, dan hanya struktur dan Kaedah boleh diwarisi. ; dalam bahasa berorientasikan objek prototaip, tingkah laku dan status objek adalah milik objek itu sendiri dan boleh diwarisi bersama (sumber rujukan), yang lebih dekat dengan realiti objektif.
Akhir sekali, bahasa berorientasikan objek berasaskan kelas seperti Java membenarkan sifat statik dan kaedah statik diisytiharkan dalam kelas untuk mengatasi kesulitan tidak dapat menggunakan fungsi dan pembolehubah global dalam bahasa prosedur. Sebenarnya, tidak ada konsep statik yang dipanggil dalam dunia objektif, kerana semuanya adalah objek! Dalam bahasa berorientasikan objek prototaip, kecuali untuk objek terbina dalam, objek global, kaedah atau sifat tidak dibenarkan wujud, dan tiada konsep statik. Semua unsur bahasa (primitif) mesti bergantung pada objek untuk kewujudannya. Walau bagaimanapun, disebabkan oleh ciri-ciri bahasa berfungsi, objek yang bergantung kepada unsur bahasa berubah dengan perubahan dalam konteks masa jalan, yang secara khusus ditunjukkan dalam perubahan dalam penunjuk ini. Ciri inilah yang lebih dekat dengan pandangan semula jadi bahawa "segala-galanya adalah milik sesuatu, dan alam semesta adalah asas untuk kelangsungan hidup semua perkara."


Pengetahuan asas berorientasikan objek JavaScript

Walaupun JavaScript itu sendiri tidak mempunyai konsep kelas, ia masih mempunyai ciri berorientasikan objek, walaupun ia berbeza daripada bahasa berorientasikan objek biasa.

Cara mudah untuk mencipta objek adalah seperti berikut:

function myObject() {

};

JavaScript 中创建对象的方法一般来说有两种:函数构造法和字面量法,上面这种属函数构造法。下面是一个字面量法的例子:

var myObject = {

};

Salin selepas log masuk

Jika anda hanya memerlukan satu objek dan tidak memerlukan contoh objek yang lain, adalah disyorkan untuk menggunakan kaedah literal. Jika berbilang contoh objek diperlukan, pembina fungsi disyorkan.
Tentukan sifat dan kaedah

Kaedah pembinaan fungsi:

function myObject() {
 this.iAm = 'an object';

 this.whatAmI = function() {
 console.log('I am ' + this.iAm);
 };
};

Salin selepas log masuk

Kaedah literal:

var myObject = {
 iAm : 'an object',

 whatAmI : function() {
 console.log('I am ' + this.iAm);
 }
};

Salin selepas log masuk

Objek yang dicipta oleh dua kaedah di atas mempunyai sifat bernama "iAm" dan kaedah bernama "whatAmI". Sifat ialah pembolehubah dalam objek, dan kaedah adalah fungsi dalam objek.

Cara mendapatkan atribut dan kaedah panggilan:

var w = myObject.iAm;

myObject.whatAmI();

Salin selepas log masuk

Apabila memanggil kaedah, anda mesti menambah kurungan selepasnya. Jika anda tidak menambah kurungan, maka ia hanya akan mengembalikan rujukan kepada kaedah tersebut.
Perbezaan antara dua kaedah mencipta objek

  • Apabila mentakrifkan sifat dan kaedah dalam pembina fungsi, anda mesti menggunakan awalan ini, yang tidak diperlukan dalam kaedah literal.
  • Pembina fungsi menggunakan = apabila memberikan nilai kepada sifat dan kaedah, dan kaedah literal menggunakan : .
  • Jika terdapat berbilang sifat atau kaedah, ia harus dipisahkan dengan ; dalam pembina fungsi dan dengan , dalam kaedah literal.

Untuk objek yang dibuat dengan kaedah literal, anda boleh memanggil terus sifat atau kaedahnya menggunakan rujukan objek:

myObject.whatAmI();

Salin selepas log masuk

Untuk pembina fungsi, anda perlu mencipta contoh objek sebelum anda boleh memanggil sifat atau kaedahnya:

var myNewObject = new myObject();
myNewObject.whatAmI();

Salin selepas log masuk

Gunakan pembina

Sekarang mari kembali kepada kaedah pembinaan fungsi sebelumnya:

function myObject() {
 this.iAm = 'an object';
 this.whatAmI = function() {
 console.log('I am ' + this.iAm);
 };
};

Salin selepas log masuk

Sebenarnya, ia kelihatan seperti fungsi Memandangkan ia adalah fungsi, bolehkah saya menghantar parameter kepadanya? Ubah suai kod sedikit:

function myObject(what) {
 this.iAm = what;
 this.whatAmI = function(language) {
 console.log('I am ' + this.iAm + ' of the ' + language + ' language');
 };
};

Salin selepas log masuk

Kemudian nyatakan objek dan masukkan parameter:

var myNewObject = new myObject('an object');
myNewObject.whatAmI('JavaScript');

Salin selepas log masuk

Output akhir program ini ialah saya adalah objek bahasa JavaScript.
Terdapat dua cara untuk mencipta objek, yang manakah harus saya gunakan?

Untuk kaedah literal, kerana ia tidak memerlukan instantiasi, jika nilai objek diubah suai, nilai objek diubah suai secara kekal dan sebarang akses lain akan menjadi nilai yang diubah suai. Untuk pembina fungsi, apabila mengubah suai nilai, nilai contohnya diubah suai Ia boleh menjadikan N objek, dan setiap objek boleh mempunyai nilai yang berbeza tanpa mengganggu satu sama lain. Bandingkan coretan kod berikut.

Mari kita lihat kaedah literal dahulu:

var myObjectLiteral = {
 myProperty : 'this is a property'
};

console.log(myObjectLiteral.myProperty); // log 'this is a property'

myObjectLiteral.myProperty = 'this is a new property';

console.log(myObjectLiteral.myProperty); // log 'this is a new property'

Salin selepas log masuk

Walaupun pembolehubah baharu dicipta untuk menunjuk ke objek ini, hasilnya masih sama:

var myObjectLiteral = {
 myProperty : 'this is a property'
};

console.log(myObjectLiteral.myProperty); // log 'this is a property'

var sameObject = myObjectLiteral;

myObjectLiteral.myProperty = 'this is a new property';

console.log(sameObject.myProperty); // log 'this is a new property'

Salin selepas log masuk

Lihat kaedah pembinaan fungsi sekali lagi:

// 用函数构造法
var myObjectConstructor = function() {
   this.myProperty = 'this is a property'
};

// 实例化一个对象
var constructorOne = new myObjectConstructor();

// 实例化第二个对象
var constructorTwo = new myObjectConstructor();

// 输出
console.log(constructorOne.myProperty); // log 'this is a property'

// 输出
console.log(constructorTwo.myProperty); // log 'this is a property'

和预期一样,两个对象的属性值是一样的。如果修个其中一个对象的值呢?

// 用函数构造法
var myObjectConstructor = function() {
 this.myProperty = 'this is a property';
};

// 实例化一个对象
var constructorOne = new myObjectConstructor();

// 修改对象的属性
constructorOne.myProperty = 'this is a new property';

// 实例化第二个对象
var constructorTwo = new myObjectConstructor();

// 输出
alert(constructorOne.myProperty); // log 'this is a new property'

// 输出
alert(constructorTwo.myProperty); // log 'this is a property'

Salin selepas log masuk

Seperti yang anda boleh lihat, objek berbeza yang dibuat instantiated menggunakan pembina fungsi adalah bebas antara satu sama lain dan setiap satunya boleh mempunyai nilai yang berbeza. Oleh itu, kaedah mana yang hendak digunakan untuk mencipta objek bergantung pada keadaan sebenar.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan