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