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