前端知识范围庞大 ,自己的知识体系有些零散,暂且总结一些自己现阶段比较重视的知识点,面向对象编程与其说是知识,不如说是能力,是经验;根据大神阮一峰的总结,拾人牙慧,结合自身的基础积累,构筑自己的知识体系,以备后来参考!

“面向对象编程”(Object Oriented Programming,简称OOP),创建对象是基于构造函数(constructor)和原型链(prototype)创建的;

var Constructor=function(){//构造函数名首字母要大写
    this.price="1元";
};
注意事项
1、函数体内部使用了this关键字,代表了所要生成的对象实例;
2、生成对象的时候,必需用new命令,调用Constructor函数

      使用new关键字创造实例

var Constructor=function(){
    this.price="1元";
};
var c=new Constructor();
c.price;//1元

      如果没有用new关键字,直接调用会出错(this指向window,price变为全局变量)

var Vehicle = function (){
  this.price = 1000;
};

var v = Vehicle();
v.price
// Uncaught TypeError: Cannot read property \'price\' of undefined

price
// 1000

解决办法有两个:

1、用严格模式,不使用new时会报错(严格模式下,函数内部this不能指向window,默认为unidefined,unidefined不能添加属性)

function Fubar(foo, bar){
  \'use strict\';
  this._foo = foo;
  this._bar = bar;
}

Fubar()
// TypeError: Cannot set property \'_foo\' of undefined

2、在内部做判断,如果没有new,返回一个实例对象

function Fubar(foo, bar){
  if (!(this instanceof Fubar)) {
    return new Fubar(foo, bar);
  }
  this._foo = foo;
  this._bar = bar;
}
Fubar(1, 2)._foo // 1
(new Fubar(1, 2))._foo // 1

如果构造函数内部有return 语句,判断返回的语句是否是对象,如果不是,则返回this对象。

var Vehicle = function () {
  this.price = 1000;
  return 1000;
};

(new Vehicle()) === 1000
// false

如果new的函数不是构造函数(没有this),则返回空对象

function getMessage() {
  return \'this is a message\';
}
var msg = new getMessage();
msg // {}
typeof msg // "Object"

new命令简化的内部流程

function _new(/* 构造函数 */ constructor, /* 构造函数参数 */ param1) {
  // 将 arguments 对象转为数组
  var args = [].slice.call(arguments);
  // 取出构造函数
  var constructor = args.shift();
  // 创建一个空对象,继承构造函数的 prototype 属性
  var context = Object.create(constructor.prototype);
  // 执行构造函数
  var result = constructor.apply(context, args);
  // 如果返回结果是对象,就直接返回,则返回 context 对象
  return (typeof result === \'object\' && result != null) ? result : context;
}

// 实例
var actor = _new(Person, \'张三\', 28);

new有个target属性,new.target指向函数本身,或者是unidefined

function f() {
  console.log(new.target === f);
}

f() // false
new f() // true

 

版权声明:本文为web-jinglei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/web-jinglei/p/6553266.html