javascript中的构造函数和函数的原型属性

<script>
//构造函数
//构造函数的缺点就是每个方法都要在每个实例上创建一边
function Person(name,age,sex)
{
 this.name=name;
 this.age=age;
 this.sex=sex;
 this.sayName=new Function("alert(this.name);");
}
var p1=new Person("yjc",26,"man");
var p2=new Person("yjc1",26,"man");
//p1,p2都有一个Function类型的方法,但这两个方法属于不同的Function类型的实例(即两个实例)
p1.sayName();
alert(p1.sayName==p2.sayName);//false

//--------------------------------------------------------
//我们可以这样改造构造函数
function Person1(name,age,sex)
{
 this.name=name;
 this.age=age;
 this.sex=sex;
 this.sayName=sayName;
}
//将sayName函数定义到构造函数的外面
function sayName()
{
 alert(this.name);
}
var p11=new Person1("yjc11",26,"man");
var p12=new Person1("yjc12",26,"man");
//这样Person1的两个实例p11和p12的sayName方法共享了全局作用域中的同一个函数
//但是问题又出现了,这样的换就体现不到面向对象的封装性了,然而我们可以用函数的prototype(原型)来实现。
alert(p11.sayName==p12.sayName);//true
//---------------------------------------------------------

function Person2(name,age,sex)
{
 Person2.prototype.name=name;
 Person2.prototype.age=age;
 Person2.prototype.sex=sex;
 Person2.prototype.sayName=function(){
 alert(this.name);};
}
var p21=new Person2("yjc21",26,"man");
var p22=new Person2("yjc22",26,"man");

alert(p21.sayName==p22.sayName);
//我们将sayName方法和属性添加到了 Person2的protortype原型里,Person2的实例同样具有了所有的属性和sayName方法,不同的是,实例p21,p22的属性和方法是所有实例共享的,换句话说,他们的实例访问的是同一组属性,和同一个sayName();
//在默认情况先,我们创建的每个函数都有一个默认的原型prototype,他包含了该函数所有的属性和方法,prototype原型还有一个constructor属性,改属性指向当前实例的构造函数,即Person2
//我们可以利用这个属性来扩展我们的函数

</script>

原文地址:https://www.cnblogs.com/lovejunxia/p/2012320.html