var obj = {};
console.info(obj.__proto__===Object.getPrototypeOf(obj));//true
console.info(obj.__proto__===Object.prototype);//true
•每一个函数都有一个属性prototype,这个属性是在函数定义过程中添加的,它指向的对象就是所有使用该函数创建的实例对象的原型对象。
复制代码 代码如下:
var fn = function(){};
console.info(typeof fn.prototype);//object,一旦定义了函数,就会添加prototype属性,指向原型对象
var obj1 = new fn();
console.info(fn.prototype === Object.getPrototypeOf(obj1));//true,所有使用fn创建的实例的原型对象都指向fn.prototype
var obj2 = new fn();
console.info(fn.prototype === Object.getPrototypeOf(obj2));//true
console.info(Object.getPrototypeOf(fn) === Function.prototype);//true
当然,fn本身也是一个对象,也有自己的原型对象,它的原型对象就是Function的属性prototype了(fn.__proto__===Function.prototype)。
我们知道,每一个对象都可以访问一个属性constructor,指向创建这个对象的函数(构造函数),实际上,constructor属性只不过是构造函数的原型对象的一个属性而已,因此通过构造函数创建的实例都能够访问constructor。
复制代码 代码如下:
var fn = function fn(){};
var obj1 = new fn();
console.info(fn.constructor);//Function()
console.info(fn.prototype.constructor);//fn(),函数原型对象的constructor指向函数本身console.info(obj1.hasOwnProperty('constructor'));//false,实例本身没有constructor属性console.info(fn.prototype.constructor === obj1.constructor);//true,实例可以访问到原型对象中的constructor属性
•函数的原型对象具有动态性,即便先创建实例,后修改原型对象,也还是能够通过实例访问到对原型对象所做的变更。
复制代码 代码如下:
var fn = function fn(){};
var obj = new fn();
console.info(obj.name);//undefined
fn.prototype.name = 'linjisong';
console.info(obj.name);//linjisong
3、创建对象
创建方式
示例
说明
传统方式
var person = new Object(); person.name = 'linjisong'; person.job = 'it';
传统方式创建对象容易产生大量重复的代码对象字面量
var person = { name : 'linjisong', job : 'it' };
使用对象字面量创建简洁明了,非常适合创建作为函数实参的对象工厂模式
function createPerson(name, job){ var o = new Object(); o.name = name; o.job = job; return o; } var person = createPerson('linjisong','it');
1、工厂模式能有效解决重复代码问题。
2、但是不能判定对象的类型
构造函数模式
function Person(name, job){ this.name = name; this.job = job; this.getName = function(){ return this.name; } } var person = new Person('linjisong','it');
构造函数模式能解决重复代码问题,也能够判定对象的类型
但是这种模式下创建的每个实例都有一份属性和方法的Copy
对于方法来说,每个实例都保存一份是没有必要的
使用new调用构造函数的内部步骤:
(1)创建一个新对象
(2)将构造函数的作用域赋给新对象(构造函数内this指向新创建对象)
(3)执行构造函数中的代码
(4)返回新对象
原型模式