构造函数与构造函数的继承以及call和apply的区别

来源:互联网 发布:淘宝新手开店视频教程 编辑:程序博客网 时间:2024/06/07 05:46
//(一)、工厂模式 /* 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的 过程. **/ //下面首先来个简单易懂的例子吧!注释很详细,不理解的朋友一起来看看吧! //1.普通函数 function demo(){ //第一步:进入工厂,创建个函数; var obj = new Object(); //第二步:进行"加工" obj.name = "张三"; obj.age = 20; obj.showname = function(){ alert(obj.name); } //第三步:"出厂" return obj;//也有不用return的,不过感觉这样更好理解点 } var obj = demo(); console.log(obj.name);//输出:"张三" //也可调用方法 obj.showname(); //这就是一个完整的工厂模式了,这是从比较好理解的一方面讲解的 //2.构造函数 构造函数通过上边的工厂模式也可以转变成一个简单的构造函数 //先看下例子: function Bemo(name,age,showname){ this.name = name; this.age = age; this.showname = showname;//这个方法在这采用直接传入都可以 } //构造函数需要用new产生新的函数 var obj1 = new Bemo("张三","18",function(){alert(this.name)}); console.log(obj1.name) //构造函数也可以通过原型对象prototype来添加属性 Bemo.prototype.sex = "男"; console.log(obj1.sex); //通过原型链追加的属性,构造出的其他函数也可以调用 var obj2 = new Bemo("李四","20",function(){console.log("hello world!")}); console.log(obj2.sex);//这样看来这样追加的属性,是个公共属性都有的可以调用,要记住啊 /*在ECMAscript中的狗早函数可用来创建特定类型的对象.像Object和Array这样的原生构造函数, 在运行时会自动出现在执行环境中. 此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法; 再冲心举个构造函数的例子 */ //构造一个人的类,javascript没有类的概念,使用构造函数模拟类使用的,更加方便 function Person(name,age,sex,job){ this.name = name; this.age = age; this.sex = sex; this.job = job; this.say = function(){ alert("hello world!"); }; this.sayName = function(){ alert(this.name); } } Person.prototype.walk = function(){ alert("没事儿走两步"); } var person1 = new Person("赵四",25,"男","警察"); var person2 = new Person("小李",20,"女","空姐"); console.log(person1.name); person2.say(); /*在这个例子中,Person()函数取代了普通函数的名字,构造函数有普通函数的区别有:*/ //1.一个比较直观,并且需要遵守的一个约定,构造函数的命名首字母要用大写 //2.没有显式的创建对象; //3.直接将属性和方法付给了this对象 //4.没有return语句 //构造函数 new的作用 /* 1.可以重新创建一个空的新对象 2.让空对象去调用构造函数给自己赋值(也就是使用心得对象去掉函数,this也就是当前创建的新对象) 3.执行构造函数中的代码(为这个新对象添加属性) 4.返回心对象 */ //3.继承 /* 在这只简单介绍比较好理解的 直接从例子开始 */ function Father(name,money,house){ this.name = name; this.money = money; this.house = hose; } function Son(name,money,house){ //或 Father.call(this,name,money,house) Father.apply(this,[name,money,house]); } var son = new Son("李",200,"100平米"); //这个是直接继承父亲的属性name,money和house;用apply或call实现继承 //apply和call的区别 call后边是直接加参数串,apply后边是加数组 function Father(name,money,house){ this.name = name; this.money = money; this.house = hose; } Father.protoype.firstName = "沈"; Object.prototype.hobby = "篮球";//对象的原型 function Son(name,money,house){ //或 Father.call(this,name,money,house) Father.apply(this,[name,money,house]); } Son.prototype.firstName = Father.prototype.firstName; alert(son.firstName); //这样就是继承父级的原型对象 //继承是一个原型链 先找自身有没有要查找的类和方法,如果没有向上从自身的原型里找, //如果没有继续往上对象Object里找,,如果还没有就输出undefined;(万物皆对象)
0 0
原创粉丝点击