首頁 web前端 js教程 舉例說明JavaScript中的實例物件與原型物件_基礎知識

舉例說明JavaScript中的實例物件與原型物件_基礎知識

May 16, 2016 pm 03:11 PM
javascript 原型 實例 實例物件 物件

首先聲明:javascript中每個物件都有一個constructor屬性和一個prototype屬性。 constructor指向物件的建構函數,prototype指向使用建構函式建立的物件實例的原型物件。

function Person(){ 
  
 } 
var person = new Person(); 
 
Person.prototype = { 
 constructor : Person, 
 name : 'zxs', 
 age : 24, 
 sayName : function(){alert(this.name)} 
 } 
  
person.sayName(); 
登入後複製

在這段程式碼會報錯,sayName() is not defined。根據javascript高階程式設計第二版的解釋,是因為重寫的原型切斷了建構子與最初原型之間的連結。但是我們調整一下上面語句的順序。如下:

function Person(){ 
 } 
//var person = new Person(); 
Person.prototype = { 
 constructor : Person, 
 name : 'zxs', 
 age : 24, 
 sayName : function(){alert(this.name)} 
} 
/*===========================================================*/ 
var person = new Person(); 
/*===========================================================*/ 
 person.sayName(); // zxs 
alert(person.constructor) //function Object() { [native code]} or function Person() {} 取决与蓝色的语句是否有效 
登入後複製

注意上面兩段程式碼等號中間的語句。依照第二段的順序寫程式碼,將會輸出 ”zxs“,這個結果說明在第一種情況下報錯並不能說明是因為切斷了構造函數與原想之間的聯繫引起的。

Person.prototype = {} 
登入後複製

本來就是一種定義物件的方法,而且在javascript中每個物件的constructor屬性都預設的指向Object建構函數,這也不難說明重寫原型物件確實切斷了建構子與最初原型之間的聯繫,但並不能說明這種聯繫被切斷之後person就不能訪問到sayName()函數。

現在有這樣的假設:函數的prototype屬性所指向的原型對象,與我們顯示新建的原型對象並不是完全等同的。當我們呼叫函數的時候會創建一個原型對象,此時會先查找當前環境中是否存在其原型對象,如果程式中不存在,就創建一個,如果環境中存在,側查找他們的屬性和方法,最後根據尋找的結果傳回一個原型對象,這個物件中的屬性和方法總是優先使用預設原型中的屬性和方法,也就是建構函式中定義的屬性和方法。當當呼叫的方法或屬性不存在於預設的原型中時,才使用定義在Person.prototype = {} 的屬性和方法。

javascript是解釋性的語言,語句都是順序執行的,在第一段程式碼中,當我們使用new 關鍵字建立新物件的時候,Person.prototype = {} 並沒有執行,也就是說在在目前的執行環境中找不到其中定義的方法和屬性,而建構函數中沒有該方法,所以出錯。就像一個變量,給他賦值的時候程式沒有執行將不能使用。在第二段中環境中已經存在該呼叫的方法,而建構函數的原型物件已經創建完畢,所以可以得到結果。

再看下面的一段程式:

////////////////////////////////////////////////////////////////////////// 
 
function Person(){} 
 
/*===========================================================*/ 
 
 var person = new Person(); 
Person.prototype.name = 'song'; 
 
/*===========================================================*/ 
 
//Person.prototype.sayName = function(){alert(this.name)}; 
Person.prototype = { 
constructor : Person, 
name : 'zxs', 
age : 24, 
sayName : function(){alert(this.name)} 
} 
person.sayName(); // error 
 
////////////////////////////////////////////////////////////////////////// 
 
function Person(){  } 
/*var person = new Person();*/ 
Person.prototype.name = 'song';  
/*Person.prototype.sayName = function(){alert(this.name)};*/ 
Person.prototype = {   
constructor : Person, 
  name : 'zxs', 
  age : 24, 
  sayName : function(){alert(this.name)} 
} 
 
/*===========================================================*/ 
var person = new Person(); 
 
/*===========================================================*/ 
person.sayName(); // zxs 
登入後複製

從這裡可以看出使用Person.prototype.name = '',的方式不論在什麼地方創建對像都能被訪問,如果同時存在對象字面量和這種方法定義原型對象,將使用後定義的作為最終值。並且對原型物件使用物件字面量定義之後,該定義必須出現在建立物件的語句之前才能存取。

實例不能存取到原型物件中的屬性和方法,不僅是因為重寫原型物件切斷了建構子與最初原型之間的聯繫。

function Person(){  
    
  }  
var person = new Person();  
  
Person.prototype = {  
  //constructor : Person,  
  name : 'zxs',  
  age : 24,  
  sayName : function(){alert(this.name)}  
  }  
    
person.sayName();  
登入後複製

以上程式碼在實例化物件時建構函式的原型為空,它沒有任何預設屬性以外的屬性。重寫構造函數的原型確實切斷了構造函數與最初原型之間的聯繫。

在使用 new 運算子以後建構函式的原型物件中的屬性和方法已經加入 person物件中。因為以上方法為函數原型添加新屬性和方法不具有動態性,所以person不能存取到新添加的屬性和方法。

重寫原型物件之後,就如同下列程式碼:

var o = { 
  name : 'zxs' 
  } 
   
var obj = o; 
o = {} 
console.log(o.name);  
登入後複製

此時輸出的值是undefined,因為,物件是一個引用類型,「=」是賦值操作符,其運算順序是從右往左。 o={}就是說o的指向已經改變,就是一個空物件。
Person.prototype.mothed = function() {}與Person.prototype={mothed:function(){}}的差異就如同arr = []和arr.push()一樣,前者都是修改自身,後者是完全改變自身。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1663
14
CakePHP 教程
1419
52
Laravel 教程
1313
25
PHP教程
1263
29
C# 教程
1237
24
簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

如何將 MySQL 查詢結果陣列轉換為物件? 如何將 MySQL 查詢結果陣列轉換為物件? Apr 29, 2024 pm 01:09 PM

將MySQL查詢結果陣列轉換為物件的方法如下:建立一個空物件陣列。循環結果數組並為每一行建立一個新的物件。使用foreach迴圈將每一行的鍵值對賦給新物件的對應屬性。將新物件加入到物件數組中。關閉資料庫連線。

PHP 函數如何傳回物件? PHP 函數如何傳回物件? Apr 10, 2024 pm 03:18 PM

PHP函數可以透過使用return語句後接物件實例來傳回對象,從而將資料封裝到自訂結構中。語法:functionget_object():object{}。這允許創建具有自訂屬性和方法的對象,並以對象的形式處理資料。

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

學習Golang指標轉換的最佳實務範例 學習Golang指標轉換的最佳實務範例 Feb 24, 2024 pm 03:51 PM

Golang是一門功能強大且高效的程式語言,可用於開發各種應用程式和服務。在Golang中,指標是一種非常重要的概念,它可以幫助我們更靈活和有效率地操作資料。指標轉換是指在不同類型之間進行指標操作的過程,本文將透過具體的實例來學習Golang中指標轉換的最佳實踐。 1.基本概念在Golang中,每個變數都有一個位址,位址就是變數在記憶體中的位置。

C++ 函式回傳物件時有什麼需要注意的? C++ 函式回傳物件時有什麼需要注意的? Apr 19, 2024 pm 12:15 PM

在C++中,函數傳回物件需要注意三點:物件的生命週期由呼叫者負責管理,以防止記憶體洩漏。避免懸垂指針,透過動態分配記憶體或返回物件本身來確保物件在函數返回後仍然有效。編譯器可能會最佳化傳回物件的副本生成,以提高效能,但如果物件是值語義傳遞的,則無需副本生成。

原神4.4版新地圖介紹 原神4.4版新地圖介紹 Jan 31, 2024 pm 06:36 PM

原神4.4版新地圖介紹,小夥伴們原神這次4.4版本也是迎來了璃月的海燈節,同時將在4.4版本推出一個新的地圖區域,名為沉玉谷。根據提供的信息,沉玉谷實際上是翹英莊的一部分,但玩家更習慣稱其為沉玉谷。下面就讓小編來跟大家介紹一下新地圖吧。原神4.4版新地圖介紹4.4版本將開放璃月北部的「沉玉谷·上谷」、「沉玉谷·南陵」和「來歆山」,在「沉玉谷·上谷」已為旅行者開啟傳送錨點。 ※完成魔神任務序章·第三幕龍與自由之歌」後,將自動解鎖該傳送錨點。二、翹英莊當春日溫煦的柔風再度撫過沉玉的山野,那馥鬱的

分析Java中堆疊和堆疊的不同以及它們的應用情景 分析Java中堆疊和堆疊的不同以及它們的應用情景 Feb 24, 2024 pm 11:12 PM

Java堆和棧的區別及應用場景解析,需要具體程式碼範例在Java程式中,堆和棧是兩個常用的資料結構,它們在記憶體中承擔不同的角色和功能。了解堆疊和堆疊的差異對於編寫高效的Java程式至關重要。首先,我們來看看Java堆。堆是一個用來儲存物件的區域,所有在程式中被建立的物件都被儲存在堆中。堆是在程式運行時動態分配和釋放記憶體的地方,它不受任何限制,並且可以根據需要自動

See all articles