1. 程式人生 > >js例項化的物件,函式和原型的相關

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])。參考一個例子:

function 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  不是原型上的,是物件的例項化
1:(Function("alert('ddd')"))(); //ddd

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