new Object()和object.create()
2019-06-05 本文已影响0人
LoveBugs_King
new Object()
构造函数
>function Person() {
this.name = '小王'
this.age = 25
}
>var p = new Person()
构造函数执行的步骤:
1、创建一个空对象p。
var p = {}
2、执行函数Person,并指定执行环境对应的this值为p。(执行完毕后环境会销毁)
Person.call(p)
3、p继承了构造函数Person()的原型
p.__proto__ = Person.prototype
4、执行构造函数内的代码
普通函数
>function person() {
return {
name: '小王',
age: 28
}
}
>var p = person()
来说说区别吧
1、表面:调用方式,是否用new调用;函数名,首字母是否大写。
2、this指向,构造函数的this指向新建的对象。普通函数的this指向全局环境。
3、构造函数默认返回this,也就是实例对象;普通函数要设置return,否则是undefined。
一个问题:如何知道我是普通函数还是构造函数?
首先构造函数必须用用new xx(),那那么调用会生成一个新对象,可以在构造函数内执行:
// 如果返回true的话,说明是构造函数,否则就是普通函数!
this instanceof xx(构造函数名)
object.create()
Object.create = function (o) {
// 创造一个新匿名函数
var F = function () {};
// 给该匿名函数的原型指向o
F.prototype = o;
// 返回该匿名函数的实例
return new F();
};
我们平时创造对象 :
let a = {}
let a = new Object({})
区别:
创造了一个Object数据结构的实例,Object.prototype上是有方法的。
我们自己创建一个数据结构F,创造一个数据结构的实例f。f.proto会指向F.prototype。F.prototype.proto指向Function.peototype,Function.peototype.proto指向Object.prototype。
所以我们把自己创建的数据结构的prototype指向我们自己定义的对象,可以切断原本原型链。