日期:2014-05-16  浏览次数:20297 次

JavaScript学习总结1
 /***我是分割线 的开始***/
 
 //利用prototype属性可以添加公有属性和方法
   function myConstructor2(){
   		this.a='大灰狼';
   	};  //声明构造函数,可以使用对象字面量语法来向prototype属性中添加所有公有成员
   
    myConstructor2.prototype={
     propertyA: 'sha' ,
     propertyB: 'feng' ,
     methodA:function(){
      alert(this.propertyA);
     },
     methodB:function(){}
    }
   
   var myconstrustor=new myConstructor2(); //声明对象
    //alert(myconstrustor.methodA());
 var myconstrustor1=new myConstructor2(); //声明对象
 var myconstrustor2=new myConstructor2(); //声明对象
	alert("原型类测试结果="+(myconstrustor1.propertyB === myconstrustor2.propertyB));

	alert("构造函数测试结果="+(myconstrustor1.a === myConstructor2.a));

 /***我是分割线 的结束***/


function member(name, sex) {
  this.name = name;
  this.sex = sex;
  this.display = display;
}

function display() {
  var str = this.name + "是" + this.sex;
  document.write("<LI>" + str);
}
var papa = new member("杨宏文", "男生");
var mama = new member("黄雅玲", "女生");
var doggy = new member("奇 奇", "宠物狗");

papa.display();
mama.display();
doggy.display();

/*

*/

     

总结
     1. 
在构造函数中定义的属性,每个实例都有一个副本,互不影响;但是在prototype上定义的属性,在所有的实例中共享同一个属性,对属性的改变会影响到所有的实例。
    
从上面总结的观点来看,如果要模拟面向对象,那么属性最好定义在构造函数中,而方法最好定义在prototye中,否则每个实例的方法都占据一块内存,太浪费了。
     2
.从上面知道了Js中也有实例属性也有静态属性,但最终的目的是为了更好的了解Js中的继承,依据面向对象的思想,我们定义一个类,是为了实例化,使实例可以调用类中定义的属性、方法,因此可以这么说除非为了共享一个全局属性,一般情况下我们都应该定义实例属性、方法,这样类的实例就可以进行各种调用操作。承上启下,从源码可以看出定义实例属性有2中方式,一种定义在构造函数中,一种是构造函数的prototype上,到底应该使用哪一种呢,或者那种方式更好?

4.可以总结出几条规律:

1:当实例本身定义了属性,使用本身属性(可以使用hasOwnProperty进行判断)
2:如果实例本身没有定义,就到构造函数中去找;

3:如果构造函数也没有,就到构造函数的
prototype的实例对象上去找;
4:如果
prototype的实例对象没有,就到其构造函数去找;
5:
如此重复,一直到跟对象object中,没找到就报undefined错误。