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指向我们自己定义的对象,可以切断原本原型链。

上一篇下一篇

猜你喜欢

热点阅读