找个对象
在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