var girl = {};
girl.name = "小红";
girl.age = 10;
</script>
这就是最简单的封装了,把两个属性封装在一个对象里面。但是,这样的写法有两个缺点,一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有任何办法,可以看出有什么联系。
构造函数模式
为了解决从原型对象生成实例的问题,Javascript提供了一个构造函数(Constructor)模式。
所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。
比如boy和girl的原型对象现在就可以这样写:
复制代码 代码如下:
<script type="text/javascript">
function Person(name,age){
this.name = name;
this.age = age;
}
</script>
我们现在就可以生成实例对象了。
复制代码 代码如下:
<script type="text/javascript">
var boy = new Person("小明","12");
var girl = new Person("小红","10");
alert(boy.name); //小明
alert(boy.age); //12
</script>
这时Boy和girl会自动含有一个constructor属性,指向它们的构造函数。
复制代码 代码如下:
alert(boy.constructor == Person); //true
alert(girl.constructor == Person); //true
Prototype模式 Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。
复制代码 代码如下:
<script type="text/javascript">
function Person(name,age){
this.name = name;
this.age = age;
}
Person.protype.type = "人类";
Person.protype.eat = function(){
alert("吃米饭");
}
</script>
然后,生成实例:
复制代码 代码如下:
<script type="text/javascript">
var boy = new Person("小明","12");
var girl = new Person("小红","10");
alert(boy.type);//人类
boy.eat();//吃饭
</script>
这时所有实例的type属性和eat()方法,其实都是同一个内存地址,指向prototype对象,因此就提高了运行效率。
alert(boy.eat == girl.eat); //true
原型属性是一个内置属性,它指定了对象所扩展的构造器函数。
下面的代码为Animal构造器函数添加一个新的属性size,这个新属性是cat对象的原型属性。通过使用原型属性,所有扩展Animal构造器函数的对象就可以访问size属性
cat = new Animal("feline","meow", "walk/run");
cat.prototype.size = "fat";
在这种情况下,所有的Animal对象的size属性都是“fat”。原型默认为Object的新实例, 由于仍是对象, 故可以给该对象添加新的属性。就好像style是javascript的一个对象一样,也可以往style后继续添加属性。
复制代码 代码如下:
<script type="text/javascript">
/*定义一个Person类*/
function Person(_name,_age,_salary){
//Person类的公开属性,类的公开属性的定义方式是:”this.属性名“
this.Name=_name;
//Person类的私有属性,类的私有属性的定义方式是:”var 属性名“
var Age=_age;
var Salary=_salary;