js中函数、实例、原型属性、构造函数的关系

1、任何函数,即function,都有一个prototype属性,即原型属性。

2、任何prototype属性中都有一个construtor属性,指向function

  function Test(){}

 console.log(Test.prototype.constructor==Test) //true

3、当通过new 来创建function时,即创建了function的一个实例对象,简称实例(创建实例对象的方法有多种,为了避免叙述复杂,这篇文章暂时不涉及

4、new意思是新开辟了一个内存空间(堆)来存放function的内容,实例对象指向这个内存空间的地址

5、在每个实例中定义的属性只属于实例自身,不共享。

6、function中的普通属性,通过this指针来传递作用域。即,当需要new一个实例时,函数中的属性应该用this.name=xxx这种形式定义,则this作用域代表当前实例,新实例才能调用到这个属性。不用this定义的变量默认都属于windows对象(浏览器端)

   function Aaa()

{   this.name='sdf' //name属于当前作用域的属性

     name1='aaaa' //name1属于windows对象的属性

  }

 var a1=new Aaa();

console.log(a1.name) //正确,此时this指向a1

console.log(a1.name1)//undefined,name1是windows的对象

 

7、实例中会包含一个__proto__属性,指向function的prototype属性,因此就形成了一个链式调用

"实例对象.__proto__ 指向 function.prototype ,

function.prototype中的consturtor指向function"

 

function Test(){}

Test.prototype={};

var tt=new Test();

console.log(tt.__proto__==Test.prototype); //true

 

 

8、定义在构造函数中的对象属性或方法(通过this指针)属于实例对象,不共享,创建在prototye属性中的对象属性或方法,相当于静态方法,所有函数、实例对象共享。

   function Bbb(name)

{   this.name=name ;//name属于当前作用域的属性  }

  var b2=new Bbb("Vicky");

  var b3=new Bbb("Marry");

console.log(b2.name===b3.name) //false

Bbb.prototype.getName=function(){return "hello bbb"}; //给函数Bbb的原型属性prototype添加一个getName函数方法

console.log(b2.getName()); //"hello bbb" //实例对象调用原型方法时直接调用

console.log(b2.getName()===Bbb.prototype.getName());//true 

console.log(b3.getName()===Bbb.prototype.getName());//true

console.log(b2.getName()===b3.getName()); //true

 

9、如果构造函数和原型属性都定义同样的方法,则构造函数覆盖原型属性中的方法

   function Ccc(){ }

Ccc.prototype.name="Vicky";

var c4=new Ccc();

c4.name="Tom";

var c5=new Ccc();

console.log(c4.name); //Tom

console.log(c5.name);//Vicky

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值