说到原型就要提到对象,创建对象的三种方式
方式一.字面量
var obj11 = {name: 'smyh'};
var obj12 = new Object(name: `smyh`); //内置对象(内置的构造函数)
两只写法效果是一样的,第一种是字面量的写法,第二种是内置的构造函数
方式二.通过构造函数
var M = function (name) {
this.name = name;
}
var obj3 = new M('smyhvae');
方式三,Object.creat
var p = {name:'poetry'};
var obj3 = Object.create(p); //此方法创建的对象,是用原型链连接的
总结一下
var a={} 其实是var a=new Object()的语法糖
var a=[] 其实是var a-new Array()的语法糖
function Foo(){} 其实是var Foo=new Function()的语法糖
原型,构造函数,实例之间的关系
1.构造函数通过new生成实例
2.构造函数也是函数,构造函数的proprototype指向原型(所有的函数都有prototype,但实例没有)
3.原型对象中有constructor指向该原型的构造函数,
Foo.prototype.constructor===Foo //true
4.实例的_proto_属性指向原型
所有的引用类型(数组,对象,函数)都有_proto_这个属性
原型链
任何一个实例,通过原型链,找到它上面的原型,该原型对象中的方法和属性,可以被所有的原型实例共享
Object是原型链的顶端
原型可以起到继承的作用。原型里的方法都可以被不同的实例共享
//给Foo的原型添加 say 函数
Foo.prototype.say = function () {
console.log('');
}
在访问一个实例的时候,如果实例本身没找到此方法或属性,就往原型上找。如果还是找不到,继续往上一级的原型上找
用于判断实例属于哪个构造函数可以使用instanceof
- 注意1:虽然说,实例是由构造函数 new 出来的,但是实例的
__proto__
属性引用的是构造函数的prototype
。也就是说,实例的__proto__
属性与构造函数本身无关。 - 注意2:在原型链上,原型的上面可能还会有原型,以此类推往上走,继续找
__proto__
属性。这条链上如果能找到, instanceof 的返回结果也是 true。
foo instance of Foo
的结果为true,因为foo.__proto__ === M.prototype
为true
。foo instance of Objecet
的结果也为true,为Foo.prototype.__proto__ === Object.prototype
为true
。
foo.__proto__.constructor === M
的结果为true
,但是foo.__proto__.constructor === Object
的结果为false
。- 所以,用
consturctor
判断就比用instanceof
判断,更为严谨。