对象:一组无序属性的集合
对象成员:属性和方法
面向对象:将需求抽象成一个对象,然后对其成员进行分析
面向对象三大特性:
- 封装:函数封装
- 继承:js通过原型链继承
- 多态:函数根据参数个数不同返回结果不同
OOP:面向对象编程(Object-Oriented Programming),本质上就是创建对象
构造函数:
- 就是一个普通函数,只不过可以用来创建对象而已;使用new操作符创建对象 var obj = new Animal();
- 构造函数名称习惯上使用首字母大写字母表示function Animal() {},以区别于其他函数
- 构造函数和普通函数的唯一区别在于调用方式的不同,任何函数只要通过new操作符调用,就可以成为一个构造函数;若没有通过new操作符调用,则该函数只是一个普通函数
- 使用new操作符创建的每一个实例都是一个独立的实例个体
- 如果构造函数内部返回原始类型数据( string, Boolean, null, undefined, symbol, number ),返回值无效,仍然是隐式返回this
- 若构造函数内部返回引用类型数据( array, object, function ),返回值会覆盖this
function Animal (name, desc) {
console.log(this);
this.name = name;
this.desc = desc;
return ;
}
通过new操作符调用,即将函数当做构造函数使用 ,this指向的构造函数实例本身
当做构造函数使用,cat是一个对象实例,函数Animal中的this作为创建实例对象
var cat = new Animal('cat', '小猫猫');
cat.tail = 'short'; 给函数Animal中的this添加属性tail,属性值为short
console.log(cat); 输出cat的对象内容
浏览器控制台输出如图:
没有通过new操作符调用,即作为一个普通函数使用,this指向的window
没有使用new操作符调用函数,作为一个普通函数使用
var tiger = Animal('tiger', '老虎');
tiger.tail = 'none'; 给tiger添加属性tail,属性值为none, 此处会报错
console.log(tiger); 在没有函数return返回值的情况下,输出为undefined
在浏览器控制台输出如图:
在另一个对象的作用域中调用 ,this指向新建的对象o;
var o = new Object();
Animal.call(o, 'mouse', 'notail'); 使用回调函数call,将Animal函数的this指向新建对象o,即修改执行环境
在浏览器控制台输出如图: