摘要:构造函数上一章我们讲了工厂模式,它的缺点就是无法识别到底哪个属于哪个的问题。我们可以用构造函数来解决这个识别问题。来比较构造函数内的值就可以看出到底是什么类型。
构造函数
上一章我们讲了工厂模式,它的缺点就是无法识别到底哪个属于哪个的问题。我们可以用构造函数来解决这个识别问题。
//构造函数 function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var box = new Create("abc",10); alert(box.run()); //返回abc10
我们参考上一章,发现构造函数和工厂模式的区别:
1.没有集中实例化
2.没有返回对象实例
3.直接将属性和方法赋值给this
1.我们不需要在构造函数内集中实例化,因为在创建构造函数的同时,后台会自动创建一个实例化。
2.我们不需要返回这个对象的实例化,因为它是后台自动返回的。
3.this就相当于工厂模式的obj.a;
解决对象实例归属问题
如果我们想查看归属问题。必须要创建两个构造函数:
function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } function DeskTop(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var box = new Create("abc",10); var box1 = new DeskTop("def",20); alert(box instanceof Object); //这里要注意:所有的构造函数的对象都是Object. alert(box instanceof Create); //true alert(box1 instanceof Create); //false alert(box1 instanceof DeskTop); //true
构造函数编写规范:
1.构造函数也是函数,但是函数名的第一个字母大写
2.必须使用new运算符
3.必须使用new + 等同上面的函数名(首字母大写)例如:var box = new Create();
构造函数和普通函数的区别:
1.普通函数,首字母无需大写
2.构造函数,用普通函数调用方式无效
构造函数内的方法是:基本类型 or 引用类型??
我们可以通过例子来看出来到底是普通类型还是引用类型:
function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var abc = new Create("abc",10); var abc1 = new Create("abc",10);
我们讲两个传同样的值。来比较构造函数内的值就可以看出到底是什么类型。
alert(abc.a == abc1.a); //true //因为传进去的实参相同,肯定是相同的 alert(abc.b == abc1.b); //true //同上 alert(abc.c == abc1.c); //false //这里看出,他们比较的是引用地址,大家都知道引用地址肯定不相等!
基本数据类型的变量存放的是基本类型数据的实际值。而引用数据类型的变量保存对它的引用,即指针。
注:为什么用abc.c而不是abc.c(),因为abc.c是表示的引用地址,而abc.c()是返回这个引用类型的值。
如果大家还没懂为什么,可以用一张图来解释:
基本类型和引用类型
虽然这个与今天的话题好像没啥太大关系。但是我感觉我们还是有必要复习一下基础知识。
基本类型:
基本类型的比较是值的比较
基本类型是存放在栈内存中的。
基本类型的值是无法改变的。
引用类型:
引用类型的值是可以改变的。
引用类型的比较是引用的比较
引用类型是同时存放在栈内存和堆内存中的。
(栈内存中存放的是这个变量名,而堆内存存放的是地址,我们去调用时会有一个指针指向堆内存的。)
而每次实例化,地址都不相同,所以比较引用类型的地址肯定不相同!!!
下一章我们来讲原型。
文章内容有错误请及时联系作者指正!谢谢!
**Brian Lee**
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/81067.html
摘要:构造函数通过原型继承了构造函数和原型,这就形成了一个链条,通俗的讲就是原型链继承。而且方法只能冒充构造函数里面的属性和方法而无法冒充原型对象里面的属性和方法还有最大的问题就是重复使用。 前言: 写到这里,差不多就把OOP完结了,写了几篇OOP的文章,但是只是略懂皮毛,可能深入的OOP还有很多,但是我感觉写到这里也算是差不多完结了。 继承 继承是面向对象比较核心的概念,其他语言可能实现...
摘要:上一章我们谈了构造函数,他的唯一特点就是比较了地址不相同,因为大家知道引用类型是比较的引用。也就是说不用在构造函数中定义对象实例,而是直接将这些添加到原型当中。如果构造函数实例里面没有,就去原型里面查找,如果有就立即返回。 上一章我们谈了构造函数,他的唯一特点就是比较了地址不相同,因为大家知道引用类型是比较的引用。我们来谈谈原型。 原型 我们每创建一个函数都有一个原型(prototyp...
摘要:工厂模式优点集中实例化,可以传参等缺点分不清属于哪个对象我们先来谈谈优点,看例子集中实例化返回实例化对象返回返回不难看出,工厂模式比上面的例子减少了很多代码。 ECMAscript开发的两种模式:1.过程化 2.OOP(面向对象) 面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性的方法的对象。但是ECMAscript中没有类的概念! 又谈作用域 首先...
摘要:面向对象面向对象编程的全称是,简称,面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式。面向对象编程的三个主要特征是封装继承多态。 面向对象 面向对象编程的全称是Object Oriented Programming,简称OOP,面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式。面向对象编程可以看做是使用一系列对象相互协作的软件设计,面向对象程序设计的目的是在编程中促...
摘要:注意这里跟原型链继承有个比较明显的区别是并没有使用继承而是在子类里面执行父类的构造函数相当于把父类的代码复制到子类里面执行一遍这样做的另一个好处就是可以给父类传参。 Javascript继承 学过后端语言的同学对继承并不陌生,但是对JS继承少许还是有些困惑,不要试图问我是如果知道的,其实javascript继承主要是基于原型prototype实现的。 其实当你真正了解了原型链时候,再看...
阅读 3384·2019-08-30 10:54
阅读 3120·2019-08-29 16:38
阅读 2083·2019-08-26 14:06
阅读 1462·2019-08-23 15:39
阅读 2999·2019-08-23 15:37
阅读 2861·2019-08-23 13:50
阅读 3136·2019-08-22 17:14
阅读 2318·2019-08-22 15:44