js例項化的物件,函式和原型的相關
javascript是一個單執行緒的語言,但是可以通過程式碼排程在特定的時間執行。
對於js而言,每個例項化的物件都有以下的方法和屬性(也就是說共有的,既然共有那麼就是在原型上的了):
(1):constructor,constructor被用來建立物件,比如 var o = new Object();那麼constructor 就是 Object()函式。
(2):hasOwnProperty(propertyname),這表明如果一個例項化的物件(不是原型)存在給定的屬性;注意的是屬性名必須是字串的形式。
(3):isPrototypeOf(object),判定一個物件是否是另一個物件的原型。
alert(Person.prototype.isPrototypeOf(person1)); //true
alert(Person.prototype.isPrototypeOf(person2)); //true
(4):propertyIsEnumerable(propertyname), 一個給定的屬性可以用for-in語句列舉;同hasOwnProperty()一樣,屬性名必須是字串。
(5):toString():返回物件的字串形式
(6):valueOf():返回一個等於物件的字串,布林,字串的值;這個經常返回和toString()一樣的值。
對於js函式內部變數而言,函式執行結束,內部變數也就被銷燬了。
對於判定變數的型別,基值型別變數用typeof ,引用型別變數用instance of最好了。
對於ECMAScript而言,函式(首字母大寫)就是建構函式,(一般首字母大寫,函式返回型別:Object.prototype.toString.call(a)返回[object Function])。參考一個例子:
1:(Function("alert('ddd')"))(); //dddfunction Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.sayName = new function(){ return this.name }; //logical equivalent } var person1 = new Person('Nicholas', 29, 'Software Engineer'); var person2 = new Person('Greg', 27, 'Doctor'); alert(person1.sayName) alert(person1.sayName == person2.sayName); //false 不是原型上的,是物件的例項化
2:(function(){alert('ddd')})(); //ddd
3:var x=new function(){ return new String('ddd')};
alert(x); //ddd
4:var yx01 = new function() {return "ddd"};
alert(yx01);
將返回顯示[object object] ,此時該程式碼等價於:
function 匿名類(){
return "ddd";
}
var yx01 = new 匿名類();
alert(yx01);
提示:注意 new function 和 new Function的區別。
看一個繼承的例子:
function A(){
this.name='ikol';
this.hello='hello world';
}
A.prototype.getName=function(){
return this.name;
};
A.prototype.sayHello=function(){
return this.hello;
}
function B(){
A.call(this);
};
B.prototype=A.prototype;
var b=new B();
console.log(b.getName());
console.log(b.sayHello());
下面的看一個原型的例子:
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
};
function SubType(){
this.subproperty = false;
}
//繼承自SuperType
SubType.prototype = new SuperType();
//試著增加一些新的方法 - 這將清空(覆蓋)上面的一行
SubType.prototype = {
getSubValue : function (){
return this.subproperty;
},
someOtherMethod : function (){
return false;
}
};
var instance = new SubType();
alert(instance.getSuperValue()); //錯誤!
再看一個原型的例子程式碼如下,圖形描述附最後:
function SuperType(name){
this.name = name;
this.colors = [“red”, “blue”, “green”];
}
SuperType.prototype.sayName = function(){
alert(this.name);
};
function SubType(name, age){
//inherit properties
SuperType.call(this, name);
this.age = age;
}
//inherit methods
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function(){
alert(this.age);
};
var instance1 = new SubType(“Nicholas”, 29);
instance1.colors.push(“black”);
alert(instance1.colors); //”red,blue,green,black”
instance1.sayName(); //”Nicholas”;
instance1.sayAge(); //29
var instance2 = new SubType(“Greg”, 27);
alert(instance2.colors); //”red,blue,green”
instance2.sayName(); //”Greg”;
instance2.sayAge(); //27