<script>
function Person(){}
Person.prototype={
sayname:function(){alert('123');}
}
var person1=new Person();
person1.sayname();
</script><script>
function Person(){}
var person1=new Person();
Person.prototype={
sayname:function(){alert('123');}
}
person1.sayname();
</script>
这2段函数什么区别,,截然不同啊。
function Person(){}
Person.prototype={
sayname:function(){alert('123');}
}
var person1=new Person();
person1.sayname();
</script><script>
function Person(){}
var person1=new Person();
Person.prototype={
sayname:function(){alert('123');}
}
person1.sayname();
</script>
这2段函数什么区别,,截然不同啊。
function Person() {
}
var person1 = new Person(); Person.prototype.sayHello = function(){
alert('hello');
};
person1.sayHello();
因为Person.prototype,原型其实就是一个对象,对象是引用类型例子一:
function Person(){}
Person.prototype={
sayname:function(){alert('123');}
}
var person1=new Person();
person1.sayname();可以看成
var pObj = {...},//原始的原型对象
obj = {
sayname:function(){alert('123');}
};
function Person(){
}
Person.prototype=obj
var person1=new Person();
person1.sayname();
当Person这个函数创建的时候,引擎会执行类似
Person.prototype = pObj;将Person.prototype的引用指向pObj,而下面
Person.prototype=obj,就使原型指向了obj的引用,所以当我们
var person1=new Person();
的时候,person1的原型就指向了obj的引用而例子2:
function Person(){}
var person1=new Person();
Person.prototype={
sayname:function(){alert('123');}
}
person1.sayname();看成
var pObj = {...},//原始的原型对象
obj = {
sayname:function(){alert('123');}
};
function Person(){}
Person.prototype = pObj;
var person1=new Person();
Person.prototype=obj;
person1.sayname();
和例子1一样,当Person创建的时候Person的原型指向了pObj,
所以当var person1=new Person();的时候person1的原型指向了原始的原型引用pObj
儿我们Person.prototype=obj;只是修改了引用地址,它影响到的只是后面new出来的实例,因为它并没有修改person1原型的副本
大家都知道,引用类型类型要修改副本,是需要修改副本的属性来实现即function Person(){}
var person1=new Person();
Person.prototype.sayname = function(){
alert('123')
};
person1.sayname();这样才是修改原型的正确方法.
Person.prototype={
sayname:function(){alert('123');}
}
这种形式是只是用于初始化原型的时候用
function Person(){}
var person1=new Person();
Person.prototype={
sayname:function(){alert('123');}
}
person1.sayname();看成
var pObj = {...},//原始的原型对象
obj = {
sayname:function(){alert('123');}
};
function Person(){}
var person1=new Person();
Person.prototype=obj;
person1.sayname();
1、prototype是一个对象,也就是说,你用对象字面量也好,其他的方式也好,总之prototype不会从其他的原型和构造函数中继承,而只能是一个实例对象,或字面量对象。
2、直接给prototype赋值,可以看出Person是对Person的构造函数进行引用(万物皆对象),引用的结果就是当Person构造函数用来创建Person对象时,创建时的Person原型的引用就是Person实例会继承的方法它说明一个什么问题呢
简单的说,你的第一个是在new一个对象之前给prototype赋值的,因此new出来的person1有sayname方法是毫无疑问的
但是第二个例子里面,由于你在new person的时候Person.prototype的引用是object,即使后面有了prototype重新引用,也不会改变之前的结果(我用的是引用这个词,我下面对我的例子解释的时候会用到)我的例子里,虽然已经new过来,但是我没有改变Person的prototype引用,只是给prototype增加了一个方法,因此后面可以使用。。
Person.prototype={
constructor:Person,
sayname:function(){alert('123');}
}
prototype是一个对象,对象是引用类型的,理解了引用传递就清楚了