1.使用[]調用對象的屬性和方法
function User()
{
this.age = 21;
this.sex = "男?";
}
var user = new User();
alert(user["age"]);
2.動態添加,修改,刪除對象的屬性和方法
//定義類
var user = new Object();
//添加屬性和方法
user.name = "cary";
user.age = 21;
user.show = function() {
alert(this.name + "年?齡?為?:?" + this.age);
}
//執行方法
user.show();
//修改屬性和方法
user.name = "James";
user.show = function()
{
alert(this.name + "你?好?" );
}
//執行方法
user.show();
//刪除屬性和方法
user.name = "undefined";
user.show = "undefined"
//執行方法
user.show();
3.使用大括弧{}文法建立無類型對象
var obj = {};
var user =
{
name: "cary",
age: 21,
show: function() {
alert(this.name + "年?齡?為?:?" + this.age);
}
}
user.show();
var obj = {}; 等價於
var obj = new Object();
4.Prototype原型對象
每個函數function也是一個對象,對應的類類型為“Function”,每個函數對象都有一個子物件prototype,表示函數的原型,所以當我們new
一個類的對象的時候prototype對象的成員都會被執行個體化為對象的成員。例如:
function class1()
{ }
class1.prototype.show = function() {
alert("prototye member");
}
var obj = new class1();
obj.show();
5.Function函數對象詳解
5.1.Function和Date,Array,String等一樣都屬於JavaScript的內部對象,這些對象的構造器是由JavaScript本身所定義的。上面說過函數
對象對應的類型是Function,這個和數組的對象是Array一個道理。所以也可以像new Array()一樣new Function()來建立一個函數對象,而
函數對象除了使用這種方式還可以使用function關鍵字來建立。我們之所以不經常使用new Function()的方式來建立函數是因為一個函數一般
會有很多語句,如果我們將這些都傳到new Function()的參數中會顯得可讀性比較差。
var functionName=new Function(p1,p2,...,pn,body)其中p1到pn為參數,body為函數體。
5.2.有名函數和無名函數
有名函數:function funcName(){}
無名函數:var funcName=function(){}
他們之間的唯一區別:就是對於有名函數他可以出現在調用之後再定義,而對於無名函數,他必須是在調用之前就已經定義好。
5.3.我們可以利用Function的prototype對象來擴充函數對象,如:
Function.prototype.show = function() {
alert("擴充方法");
}
function fun()
{ }
fun.show();
fun.show().show();
fun.show().show();這句的意思是調用fun.show()這個函數對象的show方法。是一個遞迴的調用,因為fun.show()也是一個函數。
6.傳遞給參數的隱含參數arguments
我們在使用函數時除了傳遞制定的參數,還建立了一個隱含的參數arguments,如下:
function fun(a, b) {
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i]);
}
}
fun(1,2,3);
arguments還有一個屬性是callee,表示對函數對象本身的引用。
7.函數的apply,call方法
他們的作用都是將函數綁定到另外一個對象上去運行,兩者只是在定義參數上有區別,如下:
Function.prototype.apply(thisArg,argArray);
Function.prototype.call(thisArg[,arg1[,arg2...]]);
下面是例子,obj1的show1方法綁定到obj2後整個函數的執行環境就轉移到了obj2,所以this指標也就指向了obj2,所以會顯示fun2t:
function fun1() {
this.name = "fun1";
this.show1 = function(arg) {
alert(this.name + arg);
}
}
function fun2() {
this.name = "fun2";
this.show2 = function(arg) {
alert(this.name + arg);
}
}
var obj1 = new fun1();
var obj2 = new fun2();
obj1.show1.apply(obj2, ["t"]);
obj1.show1.call(obj2, "t");
8.JavaScript中的類實現
8.1.命名空間:我們可以使用如下方式實現命名空間,namespace1 可以看做為命名空間。
var namespace1 = new Object();
namespace1.class1 = function() {
//對?象初始化代碼
}
var obj1 = new namespace1.class1();
8.2.類成員
上面的我們已經為類添加了成員和方法,除了上面的方法我們還可以使用prototype的方式來給類新增成員,我們怎麼做才是最合理的呢,首先
來看下前面的方式:
function User() {
//建構函式
}
//成員定義
User.prototype.name = "cary";
User.prototype.show = function() {
alert(this.name);
}
上面的方式我們每定義一個類成員都要去寫User.prototype,我們可以重構為下面的形式:
function User() {
//建構函式
}
//成員定義
User.prototype =
{
name : "cary",
show = function()
{
alert(this.name);
}
}
8.3.私人成員
實作類別的私人成員主要是利用變數的範圍,我們在建構函式中實現。
function User() {
//建構函式中定義私人成員
var name="cary";
function show()
{
alert(name);
}
//共有成員
this.setname=function()
{
name="james";
}
}
8.4.靜態成員
我們可以通過給一個函數對象直接新增成員來實現靜態成員,如:
function class1()
{ }
//靜態屬性和方法
class1.staticpr = "staticpr";
class1.staticmet = function()
{ }
//調用
class1.staticmet();
我們可以通過給函數對象所在的類Function新增成員來實現給所有的函數對象預設添加靜態成員,如下:
Function.prototype.staticmet = function()
{ }
function class1()
{ }
//調用
class1.staticmet();
9.實現反射機制
使用for(...in...)方式,for中的var p來儲存User對象的屬性和方法,我們來判斷是屬性還是方法,如下:
function User() {
//建構函式
}
//成員定義
User.prototype =
{
name : "cary",
show : function()
{
alert(this.name+"Hello");
}
}
var u=new User();
for (var p in u) {
if(typeof(u[p])=="function") {
u[p]();
}
else {
alert(u[p]);
}
}