function start(a,b){
this.a=a;
this.b=b;
this.c=function(){
console.log(this.a+this.b);
}
}
var b=new start(1,2)
1.对象
1.1 创建对象
总的说来就三种形式:
直接量:var a={x:0,y:0}
通过new构造函数
通过Object.create()
但细分又有很多种,可以看我的这篇博客
2.原型
每一个JavaScript对象都与另一个对象相关联,“另一个对象”即为原型
通过关键词new+构造函数方式创建的对象的原型就是构造函数的prototype属性值
b.__proto__==start.prototype => true
3.prototype和[[Prototype]]
[[Prototype]],这个是实例中拥有的属性,它是一个指针,指向构造函数的原型,它是“内部的”,这个特性是为了实现Javascript引擎用的,因此在Javascript中不能直接访问它,同时为了表示特性是内部值,用两个方括号加以区分。Firefox,Safari,Chrome在每个对象上面都支持一个__proto__
,可以当做[[Prototype]]。
prototype是构造函数中的属性,它也是一个指针,也指向构造函数原型。但它是可见的。任何js函数都可以作为构造函数,因此每个js函数都会自动拥有一个prototype
b.prototype => undefined
b.__proto__ => 输出一个对象
start.prototype => 输出一个对象
var c={};
c.__proto__=b;
c.a => 1;
b.e=12;
c.e=12;
start.prototype.what=function(){return this.a*this.b};
b.what() => 2;
c.what() => 2;
4.constructor属性
每个js函数都会自动拥有一个prototype属性,该属性的值是一个对象,这个对象包含一个不可枚举属性constructor,而且这个属性的值是一个函数对象
*what属性是上一步添加的
通过构造函数创建的对象会继承这个属性,且属性值指代它们的构造函数
5.类的扩充
如果创建对象之后原型的属性发生改变,也会影响到继承这个原型的所有实例。之前第三小节举的例子就是对类的扩充
6.instanceof运算符
该运算符左操作数是待检测其类的对象,右操作数是定义类的构造函数。如果o继承自c.prototype,则表达式值为true
*未完待续