找个对象

在js中,定义函数的方法貌似很多,但是我觉得最常用的方法就是定义对象类,即先使用构造函数定义对象的属性,然后通过使用原型技术为对象定义共享的方法。在定义方法的时候就会用到prototype属性。再精简一点说,就是先定义名词再动词。当然,js也具有其他高级语言的3个基本特性:封装,继承,多态性。

了解下 javascript 预处理阶段 :

LexicalEnvironment
{
      a: undefined
      fn: 对函数的引用      
}

注意:a 为一个 var 的全局变量,fn 为一个声明的函数,即 function fn () {} 。var fn = function () {} 为表达式。

 

1.构造函数中的属性,属于私有,在被调用时不公用;但是属性值相等,函数方法不等。

2.prototype 一般放置实例化对象的公共属性,属于公有,在被调用时公用一套属性值和方法。

构造函数.prototype  是 [object object] ,所以在设置公有属性时,可以用对象字面量方式赋;但是,该方法属于覆盖原有属性,权衡先。

3.构造函数.prototype.constructor 属于默认原型的属性,函数指向它本身,即构造函数;假如照本文上句所说,会覆盖,则需要在对象字面量中重新指向 constructor。

那么 constructor 的应用场景 ?为何要分公有和私有 ?

4.对象.__proto__ === 对象的构造函数.prototype,皆指向公有属性,于是对象在寻找属性是,先私有,在 __proto__。

5.构造函数中的 this 指向实例化的对象,事件函数中的 this 指触发函数的对象。

6.构造函数创建的对象(实例化对象)是可以修改(添加,删除)的。

7.可以用  instanceof 判断实例化对象是否是构造函数由来。

8.构造函数原型 prototype 里的属性可被方法重写,重写后prototype中的属性不变,但实例中创建(修改?覆盖?)了这个属性,即实例对象的属性与构造对象原型的同个属性值将可能不同。

场景:function Dog(){}; Dog.prototype.sitting = false; Dog.prototype.sit = function(){if (this.sitting) {console.log('sit')} else {this.sitting = true; console.log('sit2')}};    var s = new Dog();  console.log(s.sitting)  ;console.log(Dog.prototype.sitting)

9.判断属性是对象还是构造函数原型的:hasOwnProperty

10.子函数继承复函数私有属性 Parent.call(this,param1,param2...)    //call.this 指向Child

posted @ 2018-02-06 09:13  blackatall  阅读(340)  评论(0编辑  收藏  举报