JavaScript面向对象(1)
2015-09-23 18:06
751 查看
1.工厂模式
上述代码执行的步骤:
a.创建一个对象
b.将构造函数的作用域赋值给新的对象(因此this指针指向了这个对象)
c.执行构造函数的代码(为这个新对象添加属性)
d.返回新对象
在上述代码的下面添加如下代码,得知,这两个对象都有一个constructor属性,并且该属性指向Person
alert(p1.constructor == Person); //true
alert(p2.constructor == Person); //true
3.通过原型(prototype)创建对象
先了解一些什么prototype的概念,首先它是每个函数都有的属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例
共享的方法和属性。
4.原型对象
无论在什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype对象,这个属性指向函数的原型对象,。在默认情况下,所有对象
都会自动获得一个constructor属性,这个属性包含指向一个指向prototype属性所在函数的指针。
创建了自定义的构造函数之后,其原型对象默认只会取得constructor的属性,至于其他方法,则都是从Object继承而来。
通过下图,来说明之前通过原型模式创建:
如果我们在实例中定义一个与原型中相同的属性,则原型中的属性会被屏蔽:
p1.name = 'lisi';
alert(p1.name); //lisi
如果我们删除实例中自定义的属性,并不会影响到原型中的属性:
delete p1.name;
alert(p1.name); //zhangsan
如果我们在原型中修改了属性,则所有的实例对象的属性值都会修改:
Person.prototype.name = 'wangwu';
alert(p1.name); //wangwu
alert(p2.name); //wangwu
实例在查找某个属性时,先在自己的环境中查找,找不到的话再去原型对象中查找。
5.通过重写原型对象,创建对象
function Person(){}
Person.prototype = {
constructor:Person,
name:'zhangsan',
age:23,
job:'writer',
sayName:function(){
alert(this.name);
}
};
var p1 = new Person();
p1.sayName();
因为重写了Person函数的prototype对象,所以constructor属性就不再指向Person了,而是指向新对象的constructor属性(指向Object构造函数)。
所以需要我们手动的去指定constructor为Person
function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); }; return o; } var p1 = createPerson('zhangsan',23,'writer'); p1.sayName();2.构造函数模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayHello = sayHello; function sayHello(){ alert(this.name); } } var p1 = new Person('zhangsan',21,'student'); var p2 = new Person('lisi',22,'writer');
上述代码执行的步骤:
a.创建一个对象
b.将构造函数的作用域赋值给新的对象(因此this指针指向了这个对象)
c.执行构造函数的代码(为这个新对象添加属性)
d.返回新对象
在上述代码的下面添加如下代码,得知,这两个对象都有一个constructor属性,并且该属性指向Person
alert(p1.constructor == Person); //true
alert(p2.constructor == Person); //true
3.通过原型(prototype)创建对象
先了解一些什么prototype的概念,首先它是每个函数都有的属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例
共享的方法和属性。
function Person(){} Person.prototype.name = 'zhangsan'; Person.prototype.age = 25; Person.prototype.job = 'student'; Person.prototype.sayName = function(){ alert(this.name); }; var p1 = new Person(); p1.sayName(); //zhangsan var p2 = new Person(); p2.sayName(); //zhangsan alert(p1.sayName == p2.sayName); //true
4.原型对象
无论在什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype对象,这个属性指向函数的原型对象,。在默认情况下,所有对象
都会自动获得一个constructor属性,这个属性包含指向一个指向prototype属性所在函数的指针。
创建了自定义的构造函数之后,其原型对象默认只会取得constructor的属性,至于其他方法,则都是从Object继承而来。
通过下图,来说明之前通过原型模式创建:
如果我们在实例中定义一个与原型中相同的属性,则原型中的属性会被屏蔽:
p1.name = 'lisi';
alert(p1.name); //lisi
如果我们删除实例中自定义的属性,并不会影响到原型中的属性:
delete p1.name;
alert(p1.name); //zhangsan
如果我们在原型中修改了属性,则所有的实例对象的属性值都会修改:
Person.prototype.name = 'wangwu';
alert(p1.name); //wangwu
alert(p2.name); //wangwu
实例在查找某个属性时,先在自己的环境中查找,找不到的话再去原型对象中查找。
5.通过重写原型对象,创建对象
function Person(){}
Person.prototype = {
constructor:Person,
name:'zhangsan',
age:23,
job:'writer',
sayName:function(){
alert(this.name);
}
};
var p1 = new Person();
p1.sayName();
因为重写了Person函数的prototype对象,所以constructor属性就不再指向Person了,而是指向新对象的constructor属性(指向Object构造函数)。
所以需要我们手动的去指定constructor为Person
相关文章推荐
- 深入领悟JavaScript中的面向对象
- JavaScript的对象和继承
- 了解javascript编程中的Prototype(原型)
- JavaScript 原型总结一 一切皆对象
- javascript原型,组合,动态原型,稳妥构造函数式
- 创建对象的几种方式
- 2.1解决只继承原型的副作用(临时构造器)
- 2.只继承原型(构造函数.prototype)
- javascript的面向对象 函数 闭包 构造函数 继承
- 【ECMAScript6标准入门】String
- 【ECMAScript6标准入门】3.变量的解析赋值
- 【ECMAScript6标准入门】2.const的使用
- 【ECMAScript6标准入门】1.let的使用
- 【ECMAScript6标准入门】Babel之HelloWorld
- JavaScript面向对象的讨论
- JavaScript面向对象编程指南
- JavaScript中,prototype对象是实现面向对象的一个重要机制
- 优雅的JavaScript-面向对象
- 《编写优雅的前端业务代码》听后感
- 递归数据格式转换