1.怎样实现只继承prototype
先看下面的代码:
function A(){ this.name="李可可"; this.age=21; } A.prototype.eat=function(){ console.log("I can eat") } function B(){} B.prototype=new A;//B继承了A var cc=new B; cc.eat();//I can eat cc.name;//"李可可"
我们可以看到的是,A继承了B的所有属性,那如果我们只想让B继承A.prototype属性,不想要A上面的name和age等一大堆没用的东西,那该怎么办?
有人可能就说了,直接像下面这样不就完了吗:
B.prototype=A.prototype; var cc=new B; cc.eat();//I can eat cc.name;//undefined
哟,好像很完美?继续来看
B.prototype.fuck=function(){console.log("I fuck you!")} var cc=new B,dd=new A; cc.fuck();//I fuck you! dd.fuck();//I fuck you! //哦买噶的,怎么两个人都学会骂人了 //当子类B的prototype发生变化时也会影响到A的prototype(当然反过来也是),原因也很简单,因为我们让A.prototype指向了B的prototype
解决办法:
构建一个函数,里面创建一个空的对象,并且让该空对象的prototype指向要继承的父对象,最终返回该对象的实例,代码如下
Object.createPro=function(pro){ function F(){} F.prototype=pro; return new F; }
我们可以测试来一下:
Js代码
function A(){ this.name="李可可"; this.age=21; } A.prototype.eat=function(){ console.log("I can eat") } function B(){} B.prototype=Object.createPro(A.prototype);//B只继承了A的prototype属性 var cc=new B; cc.eat();//I can eat cc.name;// B.prototype.fuck=function(){console.log("I fuck you!")}//我们现在改变B的prototype var dd=new A; dd.fuck();//报错TypeError //说明B.prototype的改变并没有影响到A的任何属性
但是这样做也太麻烦了吧,ES5帮我们解决了这个问题,我们可以直接使用Object自带的一个静态方法create():
function A(){ this.name="李可可"; this.age=21; } A.prototype.eat=function(){ console.log("I can eat") } function B(){} B.prototype=Object.create(A.prototype);//只会继承A的prototype
在继承的同时也可以给B添加一些特有的属性如下:
Js代码
function A(){ this.name="李可可"; this.age=21; } A.prototype.eat=function(){ console.log("I can eat") } function B(){} B.prototype=Object.create(A.prototype,{ p: { value: 42, writable: false, enumerable: true }//添加一个属性p,并且是不可写的,但可枚举 }); var pp=new B; pp.p;//42 pp.name;//undefined pp.eat();//I can eat pp.p=666; pp.p;//42 (不可写)
其中第二个参数很像Object.defineproperties()可以在里面配置多个属性并且给一些特殊的权限标签
当然,想通过此方法继承A的所有属性也是可以的像下面
B.prototype=Object.create(new A);
需要注意的是Object.create方法的兼容性,只有兼容ES5的浏览器才是可以的,或者我们可以自己模拟一个,就像上面的Object.createPro方法
2.关于constructor指向问题以及constructor的可枚举性
在第一个问题中,我们使用了Object.create方法实现了不同类之间的继承,然而这样做的话却存在一个问题,如下:
function A(){ this.name="李可可"; this.age=21; } A.prototype.eat=function(){ console.log("I can eat") } function B(){} B.prototype=Object.create(A.prototype); var cc=new B; cc.constructor;//A (这里我们期望的值是B,而实际上变成了A)
那么如何解决上面的问题呢?
Js代码
//我们最容易想到的是手动设置constructor属性,像下面这样 B.prototype.constructor=B;
当然我们并不希望是这样,那怎么做呢?
Js代码
//使用Object.defineProperty或Object.defineProperties方法设置constructor的enumerable为false Object.defineProperty(B.prototype,"constructor",{ value:B, enumerable:false//不可枚举 }); cc.constructor;//B B.prototype.propertyIsEnumerable("constructor");//false
有类似问题的还有使用对象字面量重写类的prototype的时候,就像下面这样
Js代码
function C(){} C.prototype={} var pp=new C; pp.constructor;//Object (我们期望的是C) C.prototype.constructor=C; C.prototype.propertyIsEnumerable("constructor");//true (同样是可枚举的) //这里也可以使用上面的方法解决
当然,还有一种办法就是你不要去重写它,只需要往上面添加属性就行,像下面这样:
Js代码
function D(){} D.prototype.x=1; var gg=new D; gg.constructor; //D D.prototype.propertyIsEnumerable("constructor");//false

Pengenalan Saya tahu anda mungkin merasa pelik, apa sebenarnya yang perlu dilakukan oleh JavaScript, C dan penyemak imbas? Mereka seolah -olah tidak berkaitan, tetapi sebenarnya, mereka memainkan peranan yang sangat penting dalam pembangunan web moden. Hari ini kita akan membincangkan hubungan rapat antara ketiga -tiga ini. Melalui artikel ini, anda akan mempelajari bagaimana JavaScript berjalan dalam penyemak imbas, peranan C dalam enjin pelayar, dan bagaimana mereka bekerjasama untuk memacu rendering dan interaksi laman web. Kita semua tahu hubungan antara JavaScript dan penyemak imbas. JavaScript adalah bahasa utama pembangunan front-end. Ia berjalan secara langsung di penyemak imbas, menjadikan laman web jelas dan menarik. Adakah anda pernah tertanya -tanya mengapa Javascr

Node.js cemerlang pada I/O yang cekap, sebahagian besarnya terima kasih kepada aliran. Aliran memproses data secara berperingkat, mengelakkan beban memori-ideal untuk fail besar, tugas rangkaian, dan aplikasi masa nyata. Menggabungkan sungai dengan keselamatan jenis typescript mencipta powe

Perbezaan prestasi dan kecekapan antara Python dan JavaScript terutamanya dicerminkan dalam: 1) sebagai bahasa yang ditafsirkan, Python berjalan perlahan tetapi mempunyai kecekapan pembangunan yang tinggi dan sesuai untuk pembangunan prototaip pesat; 2) JavaScript adalah terhad kepada benang tunggal dalam penyemak imbas, tetapi I/O multi-threading dan asynchronous boleh digunakan untuk meningkatkan prestasi dalam node.js, dan kedua-duanya mempunyai kelebihan dalam projek sebenar.

JavaScript berasal pada tahun 1995 dan dicipta oleh Brandon Ike, dan menyedari bahasa itu menjadi C. 1.C Language menyediakan keupayaan pengaturcaraan prestasi tinggi dan sistem untuk JavaScript. 2. Pengurusan memori JavaScript dan pengoptimuman prestasi bergantung pada bahasa C. 3. Ciri lintas platform bahasa C membantu JavaScript berjalan dengan cekap pada sistem operasi yang berbeza.

JavaScript berjalan dalam penyemak imbas dan persekitaran Node.js dan bergantung pada enjin JavaScript untuk menghuraikan dan melaksanakan kod. 1) menjana pokok sintaks abstrak (AST) di peringkat parsing; 2) menukar AST ke bytecode atau kod mesin dalam peringkat penyusunan; 3) Laksanakan kod yang disusun dalam peringkat pelaksanaan.

Trend masa depan Python dan JavaScript termasuk: 1. Kedua -duanya akan terus mengembangkan senario aplikasi dalam bidang masing -masing dan membuat lebih banyak penemuan dalam prestasi.

Kedua -dua pilihan Python dan JavaScript dalam persekitaran pembangunan adalah penting. 1) Persekitaran pembangunan Python termasuk Pycharm, Jupyternotebook dan Anaconda, yang sesuai untuk sains data dan prototaip cepat. 2) Persekitaran pembangunan JavaScript termasuk node.js, vscode dan webpack, yang sesuai untuk pembangunan front-end dan back-end. Memilih alat yang betul mengikut keperluan projek dapat meningkatkan kecekapan pembangunan dan kadar kejayaan projek.

Ya, teras enjin JavaScript ditulis dalam C. 1) Bahasa C menyediakan prestasi yang efisien dan kawalan asas, yang sesuai untuk pembangunan enjin JavaScript. 2) Mengambil enjin V8 sebagai contoh, terasnya ditulis dalam C, menggabungkan kecekapan dan ciri-ciri berorientasikan objek C. 3) Prinsip kerja enjin JavaScript termasuk parsing, penyusun dan pelaksanaan, dan bahasa C memainkan peranan penting dalam proses ini.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

MantisBT
Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

mPDF
mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Versi Mac WebStorm
Alat pembangunan JavaScript yang berguna

VSCode Windows 64-bit Muat Turun
Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft
