Rumah hujung hadapan web tutorial js 理解Javascript_11_constructor实现原理_javascript技巧

理解Javascript_11_constructor实现原理_javascript技巧

May 16, 2016 pm 06:18 PM
constructor Prinsip pelaksanaan

constructor是什么

简单的理解,constructor指的就是对象的构造函数。请看如下示例:

复制代码 代码如下:

function Foo(){};
var foo = new Foo();
alert(foo.constructor);//Foo
alert(Foo.constructor);//Function
alert(Object.constructor);//Function
alert(Function.constructor);//Function

对于foo.constructor为Foo,我想应该很好理解,因为foo的构造函数为Foo。对于Foo、Object、Function的构造函数为Function,我想也没什么好争议的。(因为Foo,Object,Function都是函数对象,又因为所有的函数对象都是Function这个函数对象构造出来,所以它们的constructor为Function,详细请参考《js_函数对象》)

Prototype与Constructor的关系

复制代码 代码如下:

function Dog(){}
alert(Dog === Dog.prototype.constructor);//true

在 JavaScript 中,每个函数都有名为“prototype”的属性,用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。这是一种循环引用,如图:
理解Javascript_11_constructor实现原理_javascript技巧
constructor属性来自何方
我们来看一下Function构造String的构造过程:
理解Javascript_11_constructor实现原理_javascript技巧
注:Function构造任何函数对象的过程都是一样的,所以说不管是String,Boolean,Number等内置对象,还是用户自定义对象,其构造过程都和上图一样。这里String只是一个代表而矣!
图中可以看出constructor是Function在创建函数对象时产生的,也正如'prototype与constructor的关系'中讲的那样,constructor是函数对象prototype链中的一个属性。即String=== String.prototype.constructor。

我还想用一段代码来证明一下,理论是正确的:
复制代码 代码如下:

function Person(){}
var p = new Person();
alert(p.constructor);//Person
alert(Person.prototype.constructor);//Person
alert(Person.prototype.hasOwnProperty('constructor'));//true
alert(Person.prototype.isPrototypeOf(p));//true
alert(Object.prototype.isPrototypeOf(p));//true
alert(Person.prototype == Object.prototype);//false

到现在,你会发现这和前面《原型链的实现原理》中的默认prototype指向Object.prototype有冲突,显然当时的理论不是很全面。

特别的Object
用心的读者可能会提出这样一问题,你这一套理论并不能适用于Object。因为以下的代码和你上面的理论是冲突的:
复制代码 代码如下:

alert(Object.prototype.hasOwnProperty('constructor'));//true
alert(Object.prototype.hasOwnProperty('isPrototypeOf'));//true,如果按上面的理论,这里应该返回false

真的是这样吗?不是!那我们来看一下特殊的Object是如何处理的:
理解Javascript_11_constructor实现原理_javascript技巧
你会发现,这图的原理和上面一张图的原理是一样的。这就能正确解释Object.prototype.hasOwnProperty('isPrototypeOf')为true!

constructor探究
复制代码 代码如下:

function Animal(){}
function Person(){}
var person = new Person();
alert(person.constructor); //Person

根据上一节的内容,你能正确的理解这段代码的结果吗?思考后,看一下其内存表示:
理解Javascript_11_constructor实现原理_javascript技巧
这张图明确有表明了Function构造Animal和Person的过程。同时也显示了实例person与Person的关系。

再深入一点,代码如下:
复制代码 代码如下:

function Animal(){}
function Person(){}
Person.prototype = new Animal();
var person = new Person();
alert(person.constructor); //Animal

这个时候,person的构造函数成了Animal,怎么解释?
理解Javascript_11_constructor实现原理_javascript技巧
注:图中的虚线表示Person默认的prototype指向(只作参考的作用)。但是我们将Person.prototype指向了new Animal。
此时,Person的prototype指向的是Animal的实例,所以person的constructor为Animal这个构造函数。

结论:constructor的原理非常简单,就是在对象的原型链上寻找constructor属性。

注:如果你无法正确理解本文内容,请回顾前面章节的内容。
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pemahaman mendalam tentang mekanisme pelaksanaan asas baris gilir mesej Kafka Pemahaman mendalam tentang mekanisme pelaksanaan asas baris gilir mesej Kafka Feb 01, 2024 am 08:15 AM

Gambaran keseluruhan prinsip pelaksanaan asas baris gilir mesej Kafka Kafka ialah sistem baris gilir mesej yang diedarkan yang boleh mengendalikan sejumlah besar data dan mempunyai daya pemprosesan yang tinggi dan kependaman rendah. Kafka pada asalnya dibangunkan oleh LinkedIn dan kini merupakan projek peringkat tertinggi Yayasan Perisian Apache. Architecture Kafka ialah sistem teragih yang terdiri daripada berbilang pelayan. Setiap pelayan dipanggil nod, dan setiap nod adalah proses bebas. Nod disambungkan melalui rangkaian untuk membentuk kelompok. K

Penjelasan terperinci tentang mekanisme operasi dan prinsip pelaksanaan teras PHP Penjelasan terperinci tentang mekanisme operasi dan prinsip pelaksanaan teras PHP Nov 08, 2023 pm 01:15 PM

PHP ialah bahasa skrip sebelah pelayan sumber terbuka yang popular yang banyak digunakan untuk pembangunan web. Ia boleh mengendalikan data dinamik dan mengawal output HTML, tetapi bagaimana untuk mencapai ini? Kemudian, artikel ini akan memperkenalkan mekanisme pengendalian teras dan prinsip pelaksanaan PHP, dan menggunakan contoh kod khusus untuk menggambarkan lagi proses pengendaliannya. Tafsiran kod sumber PHP Kod sumber PHP ialah program yang ditulis dalam bahasa C Selepas penyusunan, ia menjana fail boleh laku php.exe Untuk PHP yang digunakan dalam pembangunan Web, ia biasanya dilaksanakan melalui A

Prinsip pelaksanaan algoritma kawanan zarah dalam PHP Prinsip pelaksanaan algoritma kawanan zarah dalam PHP Jul 10, 2023 pm 11:03 PM

Prinsip Pelaksanaan Pengoptimuman Particle Swarm dalam PHP Particle Swarm Optimization (PSO) ialah algoritma pengoptimuman yang sering digunakan untuk menyelesaikan masalah bukan linear yang kompleks. Ia mensimulasikan tingkah laku mencari makan sekawan burung untuk mencari penyelesaian yang optimum. Dalam PHP, kita boleh menggunakan algoritma PSO untuk menyelesaikan masalah dengan cepat Artikel ini akan memperkenalkan prinsip pelaksanaannya dan memberikan contoh kod yang sepadan. Prinsip Asas Pengoptimuman Kawanan Zarah Prinsip asas algoritma kawanan zarah adalah untuk mencari penyelesaian yang optimum melalui carian berulang. Terdapat sekumpulan zarah dalam algoritma

Analisis mendalam tentang prinsip teknikal dan senario yang boleh digunakan bagi baris gilir mesej Kafka Analisis mendalam tentang prinsip teknikal dan senario yang boleh digunakan bagi baris gilir mesej Kafka Feb 01, 2024 am 08:34 AM

Prinsip pelaksanaan baris gilir mesej Kafka Kafka ialah sistem pemesejan terbitan-langganan teragih yang boleh mengendalikan sejumlah besar data dan mempunyai kebolehpercayaan dan skalabiliti yang tinggi. Prinsip pelaksanaan Kafka adalah seperti berikut: 1. Topik dan partition Data dalam Kafka disimpan dalam topik, dan setiap topik boleh dibahagikan kepada beberapa partition. Partition ialah unit storan terkecil dalam Kafka, yang merupakan fail log tidak berubah yang tersusun. Pengeluar menulis data ke topik, dan pengguna membaca daripadanya

Menganalisis prinsip pelaksanaan fungsi pemprosesan tugas tak segerak swoole Menganalisis prinsip pelaksanaan fungsi pemprosesan tugas tak segerak swoole Aug 05, 2023 pm 04:15 PM

Menganalisis prinsip pelaksanaan fungsi pemprosesan tugas asynchronous swoole Dengan perkembangan pesat teknologi Internet, pemprosesan pelbagai masalah telah menjadi semakin kompleks. Dalam pembangunan web, mengendalikan sejumlah besar permintaan dan tugasan adalah cabaran biasa. Kaedah penyekatan segerak tradisional tidak dapat memenuhi keperluan konkurensi yang tinggi, jadi pemprosesan tugas tak segerak menjadi penyelesaian. Sebagai rangka kerja rangkaian coroutine PHP, Swoole menyediakan fungsi pemprosesan tugas tak segerak yang berkuasa Artikel ini akan menggunakan contoh mudah untuk menganalisis prinsip pelaksanaannya. Sebelum kita mula, kita perlu pastikan kita ada

Kuasai mekanisme kerja asas perisian tengah Tomcat Kuasai mekanisme kerja asas perisian tengah Tomcat Dec 28, 2023 pm 05:25 PM

Untuk memahami prinsip pelaksanaan asas perisian tengah Tomcat, anda memerlukan contoh kod khusus Tomcat ialah sumber terbuka, pelayan Web Java yang digunakan secara meluas dan bekas Servlet. Ia sangat berskala dan fleksibel dan biasanya digunakan untuk menggunakan dan menjalankan aplikasi Web Java. Untuk lebih memahami prinsip pelaksanaan asas perisian tengah Tomcat, kita perlu meneroka komponen teras dan mekanisme pengendaliannya. Artikel ini akan menganalisis prinsip pelaksanaan asas perisian tengah Tomcat melalui contoh kod tertentu. Tom

Pengoptimuman dan prinsip pelaksanaan: Isih pantas dalam Java Pengoptimuman dan prinsip pelaksanaan: Isih pantas dalam Java Feb 20, 2024 pm 01:24 PM

Prinsip Pelaksanaan dan Pengoptimuman Fungsi Isih Pantas Java Isih pantas ialah algoritma pengisihan yang cekap Idea pelaksanaannya adalah untuk membahagikan masalah besar kepada berbilang masalah kecil melalui kaedah bahagi dan takluk, dan menyelesaikan sub-masalah secara rekursif untuk akhirnya memperoleh penyelesaian keseluruhan. . Dalam isihan pantas, kita perlu memilih elemen penanda aras dan membahagikan tatasusunan kepada dua bahagian, satu bahagian lebih kecil daripada elemen penanda aras dan satu lagi lebih besar daripada elemen penanda aras. Kedua-dua bahagian itu kemudian diisih dengan pantas sekali lagi sehingga terdapat hanya satu elemen bagi setiap submasalah. Akhirnya, penyelesaian kepada semua sub-masalah digabungkan untuk mendapatkan tatasusunan

Prinsip pelaksanaan operasi eksponen dalam bahasa C Prinsip pelaksanaan operasi eksponen dalam bahasa C Feb 20, 2024 pm 09:57 PM

Prinsip pelaksanaan operasi eksponen dalam bahasa C Dalam bahasa C, operasi eksponen adalah untuk mengira kuasa ke-n suatu nombor, iaitu hasil pengiraan x^n. Walaupun bahasa C itu sendiri tidak menyediakan pengendali eksponen langsung, operasi eksponen boleh dilaksanakan melalui kaedah seperti gelung atau rekursi. 1. Kaedah gelung untuk melaksanakan operasi eksponen Kaedah gelung adalah kaedah yang agak biasa untuk melaksanakan operasi eksponen. Idea asasnya ialah mengira hasil melalui berbilang gelung dan pendaraban kumulatif. Kod sampel adalah seperti berikut: #includedoublepow

See all articles