构造函数
a. 构造函数的首字母大写 (习惯)
b. 内部使用this对象,指向即将生成的实例对象
c. 使用new来生成实例对象
new 一个对象
1 2 3 4 5 6 7
| function Person(){ this.p = “I’m in constructed object”; this.alertP = function(){ alert(this.p); } } var o2 = new Person();
|
new操作符来调用一个函数,发生了什么?
1 2 3 4
| var obj = {} obj._ptoto_ = Person.prototype; Person.call(obj); return obj
|
prototype属性
每一个构造函数都有一个属性:prototype,其作用是为一个特定类申明通用的变量和函数。
在函数内定义的变量和函数如果不对外提供接口,外部将无法访问。
1 2 3 4 5
| function Obj(){ var a=0; //私有变量 var fn=function(){ //私有函数 } }
|
1 2 3
| var o=new Obj(); console.log(o.a); //undefined console.log(o.fn); //undefined
|
静态变量、函数
当定义一个函数后,通过.添加的属性和函数,通过对象本身是可以访问,但实例却不可以访问,这样的变量和函数称为静态变量和静态函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function Obj(){
}
Obj.a=0; //静态变量
Obj.fn=function(){ //静态函数
}
console.log(Obj.a); //0 console.log(typeof Obj.fn); //function
var o=new Obj(); console.log(o.a); //undefined console.log(typeof o.fn); //undefined
|
实例变量和函数
1 2 3 4 5 6 7 8 9 10 11 12 13
| function Obj(){ this.a=[]; //实例变量 this.fn=function(){ //实例方法 } }
console.log(typeof Obj.a); //undefined console.log(typeof Obj.fn); //undefined
var o=new Obj(); console.log(typeof o.a); //object console.log(typeof o.fn); //function
|
一个函数要作为一个真正意义上的构造函数,必须满足下列条件:
1 2
| 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。
|
原型和原型链
所有引用类型(函数,数组,对象)都拥有proto属性(隐式原型)
所有函数拥有prototype属性(显式原型)(仅限函数)
原型对象:拥有prototype属性的对象,在定义函数时就被创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| //创建构造函数 function Word(words){ this.words = words; } Word.prototype = { alert(){ alert(this.words); } } //创建实例 var w = new Word("hello world"); w.print = function(){ console.log(this.words); console.log(this); //Person对象 } w.print(); //hello world w.alert(); //hello world
|
实例w的隐式原型指向它构造函数的显式原型,指向的意思是恒等于
1
| w.__proto__ === Word.prototype
|
当调用某种方法或查找某种属性时,首先会在自身调用和查找,如果自身并没有该属性或方法,则会去它的proto属性中调用查找,也就是它构造函数的prototype中调用查找。
1 2 3 4 5 6 7 8
| Function.prototype.a = "a"; Object.prototype.b = "b"; function Person(){} console.log(Person); //function Person() let p = new Person(); console.log(p); //Person {} 对象 console.log(p.a); //undefined console.log(p.b); //b
|
1 2 3 4 5 6 7
| function Function(){} console.log(Function); // Function() console.log(Function.prototype.constructor); //Function() console.log(Function.prototype.__proto__); //Object.prototype console.log(Function.prototype.__proto__.__proto__); //NULL console.log(Function.prototype.__proto__.constructor); //Object() console.log(Function.prototype.__proto__ === Object.prototype); //true
|