面向对象 - day02
创建对象:
new运算符: 1. 执行函数 2. 自动创建一个空对象 3. 把空对象指向另一个对象 4. this绑定到这个空对象 5. 隐式返还this
原型链: 链上都是对象,有限长度 (终点是 null)
var obj = new Object();
var Tab = function (){}
var tab1 = new Tab();
1. 访问对象原型:obj.__proto__
2. 构造函数访问原型:Tab.prototype
3. 原型链: tab1.__proto__ (tab1.__proto__).__proto__ ((tab1.__proto__).__proto__ ).__proto__ 【Tab.prototype Object null 】
4. 原型链的终点是: null (会不会很惊讶)
构造函数判断类型:
tab1.__proto__.constructor.name // Tab
tab1.__proto__.__proto__.constructor.name // Object
tab1.__proto__.__proto__ .__proto__ // null Object.prototype.__proto__ == null
工厂模式: 像产品一样生产对象,函数return一个对象
function createObj( name, age ){
var obj = new Object();
obj.name = name;
obj.age = age;
return obj;
}
构造函数模式:
方法一: var obj = new Object(); // 构建原生对象
方法二:
function Product( name ){
// var obj = new Object(); 隐式创建空对象 且 this绑定到这个空对象
this.name = name;
this.num = 0;
// return this; 隐式返还 this
};
Product.prototype.add = function(){ // Product.prototype 创建了一个公共空间
this.num++;
console.log(this.num);
};
// Product.prototype 对象,默认只有一个属性 constructor; 可以往对象里添加新的属性
Product.prototype.constructor === Product // true 任何对象都有它的构造函数,任何函数的原型都是对象
// 获得构造函数的原型: Product.prototype;
var prod1 = new Product();
var prod2 = new Product();
// Object.prototype.__proto_ === null
// 类的继承, 在现有类的基础上定义新的类 (类共享数据结构的机制) --- 放在day03
// 类的继承包含两部分: 构造函数内定义的属性 和 构造函数原型上定义的方法 ---> 属性 和 方法的继承
// 仿照一个 new 运算符 ---- myNew函数
function myNew( constructor, ...arg ){ --> 参数: 构造函数 和 参数
let obj = {};
constructor.call( obj, ...arg );
obj.__proto__ = constructor.prototype;
return obj;
}