JavaScript中的prototype,prototype

來源:互聯網
上載者:User

JavaScript中的prototype,prototype


1、prototype

在JavaScript中並沒有類的概念,但JavaScript中的確可以實現重載,多態,繼承。這些實現其實方法都可以用JavaScript中的引用和變數範圍結合prototype來解釋。

2、Simple Example
var Blog = function( name, url ){    this.name = name;    this.url = url;};Blog.prototype.jumpurl = '';Blog.prototype.jump = function(){    window.location = this.jumpurl;};/* *等同於Blog.prototype = {    jumpurl : '',    jump : function(){        window.location = this.jumpurl;    }};*/var rainman = new Blog('rainman', 'http://rainman.cnblogs.com');var test = new Blog('test', 'http://test.cnblogs.com');

這是一個非常簡單的例子,但卻可以很好的解釋prototype內在的一些東西,先看的記憶體配置:

通過可以看到下面這些內容:

  • prototype只是函數的一個屬性,該屬性的類型是一個對象。
  • 記憶體配置狀況:
    函數Blog擁有一個prototype屬性,而prototype屬性擁有一個變數和一個函數;
    test和rainman兩個變數都分別有name和url兩個變數;
    test和rainman兩個變數都有一個jumpUrl變數和一個jump函數,但是並沒有分配記憶體,它們是對Blog.protype中的引用

 

3、擴充1:Website.prototype = Blog.prototype
var Blog = function( name, url ){    this.name = name;    this.url = blogurl;};Blog.prototype.jumpurl = '';Blog.prototype.jump = function(){    window.location = this.jumpurl;};var rainman = new Blog('rainman', 'http://rainman.cnblogs.com');var test = new Blog('test', 'http://test.cnblogs.com');var Website = function(){};Website.prototype = Blog.prototype;var mysite = new Website();

通過可以看到下面這些內容:

  • "Website.prototype = Blog.prototype;":Website的prototype並沒有分配記憶體,只是引用了Blog的prototype屬性。
  • mysite的兩個屬性也沒有分配記憶體,也只是分別引用了Blog.prototype.jumpurl和Blog.prototype.jump

 

4、擴充2:Website.prototype = new Blog()
var Blog = function(){};Blog.prototype.jumpurl = '';Blog.prototype.jump = function(){    window.location = this.jumpurl;};var Website = function(){};Website.prototype = new Blog();var mysite = new Website();

通過可以看到下面這些內容:

  • Website的prototype屬性,只是Blog的一個執行個體( 同rainman=new Blog(); );因此Website的prototype屬性就具有了jumpurl變數和jump方法了。
  • mysite是Website的一個執行個體,它的jumpurl和jump方法是繼承自Website的prototype,而Web.prototype繼承自Blog.prototype(這裡與其說是繼承,不如說是引用)
  • 整段程式在啟動並執行過程中,記憶體中只分配了一個jumpurl變數和一個jump方法
5、new運算子

JavaScript中new運算子是建立一個新對象。使用方法:

new constructor[(arguments)]
其中constructor是必選項。對象的建構函式。如果建構函式沒有參數,則可以省略圓括弧。
arguments是可選項。任意傳遞給新物件建構函數的參數。

JavaScript中new運算子說明
new 運算子執行下面的任務: 
建立一個沒有成員的對象。 
為那個對象調用建構函式,傳遞一個指標給新建立的對象作為 this 指標。 
然後建構函式根據傳遞給它的參數初始化該對象。 
樣本
下面這些是有效 new 運算子的用法例子。
my_object = new Object;
my_array = new Array();
my_date = new Date("Jan 5 1996");

   

6、其它
  • 在絕大多數JavaScript版本中,JS引擎都會給每個函數一個空的原型對象,即prototype屬性。


對於javascript中的prototype問題

關於javascript中的prototype問題
nction B(){}
B.prototype = new A();
在你的代碼中並沒有定義B類的具體內容。(通常 我們將大寫開頭的,稱作為一個類。將小寫開頭的稱作一個方法)
這句話的意思是 B從A的一個執行個體繼承而來,那麼A有的屬性、方法,B都通過繼承得到。
下面是一個小例子:有不懂繼續百度,可以學到很多東西

function ClassA(){
//this.a = "a";
ClassA.prototype.a="a";
}
function ClassB(){
this.b = "b";
}
ClassB.prototype = new ClassA();

var objB = new ClassB();
for(var p in objB)
document.write(p " ");

//alert(objB.a);
//ClassB.prototype.a = "changed!!";
//alert(objB.a);

var objB1 = new ClassB();
var objB2 = new ClassB();
objB1.a = "!!!";
alert(objB1.a);//"!!!"
alert(objB2.a);//"a"

//每個子類對象都只有同一個原型的引用
//所以子類對象中的原型成員實際是同一個
function A(){
this.a = function(){alert();};
}
function B(){
this.b = function(){alert();};
this.c="1";
}
B.prototype = new A();
var b1 = new B();
var b2 = new B();
alert(b1.a == b2.a);//ture
alert(b1.b == b2.b);//false
alert(b1.c === b2.c);//ture

//構造子類時,原型的建構函式不會被執行;
function C(){
alert("a");
this.a = function(){alert();};
}
function D(){
alert("b");
this.b = function(){alert();};
}
D.prototype = new C();//"a"
var d1 = new D();//"b"
var d2 = new D();//"b"

//在子類對象中訪問原型成員對象
function E(){
//this.a = [];
E.prototype.a = [];
}
function F(){
......餘下全文>>
 
JavaScript中的prototype你們用過,怎使用?

定義和用法

prototype 屬性使您有能力向對象添加屬性和方法。
在本例中,我們將展示如何使用 prototype 屬性來向對象添加屬性:
<script type="text/javascript">function employee(name,job,born){this.name=name;this.job=job;this.born=born;}var bill=new employee("Bill Gates","Engineer",1985);employee.prototype.salary=null;bill.salary=20000;document.write(bill.salary);</script>輸出:20000來自:www.w3school.com.cn/js/jsref_prototype_array.asp
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.