JS函式,物件,例項方法,物件方法理解

武文博KevinLM發表於2018-04-30

 

var _s = function(){

 

var name = 'lisa';                 //內部屬性
var age = 10;
var sen = function(){
console.log("函式_s") ;  //函式內部屬性,作用域只在函式內部,
}
return "1";
}
function _e(){
name = 'lisa';
age = 10;
sen = function(){
console.log("函式_E");
}
}
var Person=function(){
this.sn = 'sam';            //例項屬性、例項方法
};
Person.say=function(){         //靜態方法
    console.log('I am a Person,I can say.')
};
var person1 = new Person();
person1.getName=function(name){    //例項方法
    console.log('My name is '+name);
}
Person.prototype.gets = function(){    //例項方法,函式原型屬性定義的屬性或者函式可以被函式所有例項物件所共用。
console.log("原型方法");
}
console.log(window.sn); //普通的函式內部this指向了當前window物件,所以賦值也是
//new 函式物件例項化後,函式屬性的this指向就發生了變化,this由原來指向window物件變為指向當前例項物件
console.log(new Person().sn); //例項化之後this指向當前物件,所以當前物件具有了sn屬性
console.log(new Person().gets());
console.log(new Person());

 

//同時在例項上、原型引用上和“this”上定義了相同名字的例項方法後,例項會優先呼叫那一個?

 

  1. var BaseClass = function() {    
  2. this.method1 = function(){    
  3.        alert(' Defined by the "this" in the instance method');    
  4.  }    
  5. };    
  6. var instance1 = new BaseClass();    
  7. instance1.method1 = function(){    
  8.     alert(' Defined directly in the instance method');    
  9. }    
  10. BaseClass.prototype.method1 = function(){    
  11.     alert(' Defined by the prototype instance method ');    
  12. }    
  13. instance1.method1();//Defined directly in the instance method    

    通過執行結果跟蹤測試可以看出直接定義在例項上的變數的優先順序要高於定義在“this”上的,而定義在“this”上的又高於 prototype定義的變數。即直接定義在例項上的變數會覆蓋定義在“this”上和prototype定義的變數,定義在“this”上的會覆蓋prototype定義的變數

 

總結:JS靜態方法或靜態屬性只能由JS函式(理解為類)呼叫,例項方法或者例項屬性只能由JS例項物件呼叫。

======================================================
函式例項化過程:
建構函式不需要顯示的返回值。使用new來建立物件(呼叫建構函式)時,如果return的是非物件(數字、字串、布林型別等)會忽而略返回值;如果return的是物件,則返回該物件。
下面簡單介紹下,javascript中new物件的過程:如var myObj = newPerson(“aty”,25);
1.建立一個空的Object物件.var obj = new Object();
2.將建構函式Person中this指向剛建立的obj物件
3.將建立的obj的__proto__指向建構函式Person的prototype。這一步是建立物件和原型直接的對應關係。firefox下通過
物件的__proto__屬效能夠訪問到原型,IE下則沒有暴露出相應的屬性。
4.執行建構函式Person()中的程式碼


//JS 函式本身就是一個建構函式,和匿名建構函式Function 是一樣的,但是Function需要new才產生一個匿名函式,
new操作符具體幹了什麼呢?其實很簡單,就幹了三件事情。
function Base(){}
var obj = new Base();
var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);   // 非常重要:將this物件的指向改變
/*第一行,我們建立了一個空物件obj
第二行,我們將這個空物件的__proto__成員指向了Base函式物件prototype成員物件
第三行,我們將Base函式物件的this指標替換成obj,然後再呼叫Base函式,於是我們就給obj物件賦值了一個id成員變數,這個成員變數的值是”base”,關於call函式的用法。*/


//Function建構函式,new Function 建立匿名函式
var BaseClass = new Function;
var Class2 = BaseClass;  
BaseClass.f1 = function(){  
console.log("BaseClass ' s static method");  
}  
Class2.f2 = function(){  
console.log("Class2 ' s static method");  
}  
BaseClass.f1();//BaseClass ' s static method  
BaseClass.f2();//Class2 ' s static method  
Class2.f1();//BaseClass ' s static method  
Class2.f2();//Class2 ' s static method  

相關文章