JS函数,对象,实例方法,对象方法理解

 

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  

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值