原型
重中之重:只有函数对象才有原型 prototype
普通对象
除去函数对象以外的对象都是普通对象
原型对象
prototype属性也叫原型对象,主要为了实现继承和共享
function a(){}
prototype和__proto__的区别
- prototype是函数才有的属性
- __proto__是每个对象才有的属性
- __proto__不是一个规范属性,部分浏览器实现了此属性,对应的标准属性是[[Prototype]]
- proto === constructor.prototype 成立
__proto__指向谁
字面量方式
var a = {}
object a指向 Object()的prototype属性
构造器方式
var A = function(){};
var a = new A();
a.__proto__.constructor == A.prototype
var a1 = {};
var a2 = Object.create(a1);
a2.__proto__指向a1
原型链
原型链查找就是通过__ proto__ 查找,查找至值为 null (也就是 Object.ptototype)时结束;也就是说Object()是最终的指向。这里也更好的理解到js中万物皆对象,因为最根本的boss就是Object()
具体应用
原型继承
构造函数与子函数
function p(){this.name = 'niu'};
p.prototype.say = function(){
alert(this.name)
}
var a = new p();
a.say()//输出结果为niu,这个不难理解,a对象继承了函数p的所有内容
alert(a.age)//在这里要注意,输出的值为undefined,这个很有意思他是undefined,不是not defined报错;a的原型是有age这个属性的,但是没有值
console.log(a)//在a的原型链上可以找到age属性
p.prototype.age=18;