JavaScript高级程序设计(第3版)学习笔记10 再访(4)


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)返回新对象

 
原型模式  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddsdz.html