方式一(基本模式 ):
<script type="text/javascript">
var player = new Object();
player.name = "詹姆斯";
player.skills = "扣篮";
player.run = function(){
return this.name+"的技术是"+this.skills;
}
alert(player.run());//输出"詹姆斯的技术是扣篮"
</script>
方式二(工厂模式):
<script type="text/javascript">
function Player(name, skills) {
var player = new Object();
player.name = name;
player.skills = skills;
player.run = function() {
return this.name + "的技术是" + this.skills;
}
return player;
}
var wade = Player("韦德", "突破");
alert(wade.run());
</script>
方式三(构造函数模式):
<script type="text/javascript">
function Player(name, skills) {
this.name = name;
this.skills = skills;
this.run = function() {
return this.name + "的技术是" + this.skills;
}
}
var olajuwon = new Player("奥拉朱旺", "盖帽");
alert(olajuwon.run());
</script>
方式四(原型模式):
prototype原型模式概念:JavaScript规定,每个构造函数都有prototype属性,指向另一个对象.这个对象的所有属性和方法,都会被构造函数的实例继承.因此可以把那些不变的属性和方法,直接定义在prototype对象上.使用prototype的定义方式,函数不会拷贝到每一个实例中,所以节省了内存.
<script type="text/javascript">
//原型模式
function Player(){}
Player.prototype.name="保罗";
Player.prototype.skills="抢断";
Player.prototype.run = function(){
return this.name+"的技术是"+this.skills;
}
var player1=new Player();
var player2=new Player();
alert(player1.run==player2.run);//true,说明引用的是同一个内存地址,指向相同的prototype对象,节省了内存
alert(player1.run());//保罗的技术是抢断
</script>
constructor属性:在JavaScript中,每个具有原型的对象都会自动获得constructor属性,用于返回创建该对象的构造函数
prototype常用验证方法:
1.isPrototypeOf() :用于判断某个prototype对象和某个实例之间的关系;
2.hasOwnproperty() :每个实例都有该方法,用于判断某个属性是本地属性还是继承自prototype对象的属性;
3.in运算符 :用于判断某个实例是否含有某个属性,不管是不是本地属性,in运算符还可以用来遍历某个对象的所有属性.
方式五(原型模式改进):
<script type="text/javascript">
//原型模式
function Player(){}
Player.prototype={
constructor:Player,//强制指向Player
name:"朗多",
skills:"抢篮板",
run:function(){
return this.name+"的技术是"+this.skills;
}
}
var player = new Player();
alert(player.run());
</script>
使用原型模式创建对象存在的问题:
1.构造函数没有参数,使用原型模式创建对象不能通过构造函数传递参数来初始化属性的值;
2.属性指向的是对象而不是函数时,函数共享不会造成问题,但对象却很少被多个实例共享,如果共享的是对象就会出现问题.
方式六(构造函数和原型组合模式):(推荐使用)
<script type="text/javascript">
function Player(name, skills) {
constructor: Player,
this.name = name
this.skills = skills
}
Player.prototype = {
run: function() {
return this.name + "的技术是" + this.skills;
}
}
var player = new Player("雷阿伦", "三分");
alert(player.run());
</script>
这是目前最为常用的创建对象方式.即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性.所有函数都只创建一次,而每个对象都具有自己的对象属性实例.
方式七(动态原型模式):
<script type="text/javascript">
function Player(name, skills) {
this.name = name
this.skills = skills
if(typeof this.run!="function"){//避免重复初始化对象
Player.prototype.run=function(){
return this.name+"的技术是"+this.skills;
}
}
}
var player = new Player("艾弗森", "突破");
alert(player.run());
</script>
动态原型方法的基本想法与构造函数和原型组合模式方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义.组合模式中实例属性与共享方法(由原型定义)是分离的,这与纯面向对象语言不太一致.动态原型模式将所有构造信息都封装在构造函数中,又保持了组合的优点.其原理就是通过判断构造函数的原型中是否已经定义了共享的方法或属性.如果没有则定义,否则不再执行定义过程.该方式只原型上方法或属性只定义一次,且将所有构造过程都封装在构造函数中,对原型所做的修改能立即体现所有实例.
以上实例如有不足请指出.