// 工厂函数模式
// 无法解决对象识别问题
function person0(name, age, job) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.job = job;
return obj;
}
// ---------------------------------------------------
// 构造函数模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
// 这个方法实例化时,会创建两次
this.sayName = function() {
alert(this.name);
};
} const person1 = new Person("test1", 19, "pig");
const person2 = new Person("test2", 19, "dog"); // ---------------------------------------------------
// 原型模式
// 初始化时无法自定义属性
function Person1() {}
Person1.prototype.name = "looyulong";
Person1.prototype.age = age;
Person1.prototype.job = job;
Person1.sayName = function() {
alert(this.name);
};
// ---------------------------------------------------
// 组合构造函数模式
// 构造函数定义属性,原型模式定义方法
function Per(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
} Per.prototype = {
constructor: Per,
sayName: function() {
alert(this.name);
}
}; const per1 = new Per("test1", 19, "pig");
const per2 = new Per("test2", 19, "dog"); // ---------------------------------------------------
// 动态构造模式
// 就是加了一个判断,判断原型上面是否有对应的方法
function Person2(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
if (typeof this.sayName !== "function") {
Person2.prototype.sayName = function() {
alert(this.name);
};
}
} // ---------------------------------------------------
// 寄生构造函数模式
// 在构造函数的内部返回一个对象,也就是new的时候返回一个对象
// 与工厂函数其实没有很大区别,只是在写法上,工厂函数创建对象需要执行一个函数
// 通过这种模式,可以达到和工厂函数相同的效果,但是却是用new操作符调用的
function Person3(name, age, job) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.job = job;
obj.sayName = function() {
alert(this.name);
alert(obj.name);
};
return obj;
} // ---------------------------------------------------
// 稳妥构造函数模式
// 没有公共属性,没有公共属性,不用this
// 因为有些环境无法是用this和new
function Person4(name, age, job) {
var obj = new Object();
obj.getName = function() {
return name;
};
obj.getAge = function() {
return age;
};
obj.getJob = function() {
return job;
};
obj.sayName = function() {
alert(name);
};
return obj;
}

Javascript中创建函数的几种方法的更多相关文章

  1. JavaScript中数组去重的几种方法

    JavaScript中数组去重的几种方法 正常情况下,数据去重的工作一般都是由后端同事来完成的,但是前端也要掌握好处理数据的能力,万一去重的工作交给我们大前端处理,我们也不能怂呀.现在我总结了一些去重 ...

  2. Java中创建数组的几种方法

    Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...

  3. 在JavaScript中创建命名空间的几种写法

    在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hel ...

  4. javascript中数组去重的4种方法

    面试前端必须准备的一道问题:怎样去掉Javascript的Array的重复项.在最近面试中,百度.腾讯.盛大等都在面试里出过这个题目.这个问题看起来简单,但其实暗藏杀机. 考的不仅仅是实现这个功能,更 ...

  5. 在Microsoft Power BI中创建地图的10种方法

    今天,我们来简单聊一聊“地图”. 在我们日常生活中,地图地位已经提升的越来越高,出门聚餐.驾驶.坐车.旅行......应运而生的就是各种Map APP. 作为数据分析师,我们今天不讲生活地图,要跟大家 ...

  6. cocos2dx中创建动画的三种方法

    1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...

  7. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 一.继承Thread类来创建线程 1.创建一个任务类,继承Thread线程类,因为Thread类已经实现了Runnable接口,然后重写run( ...

  8. 简要描述 JavaScript 中定义函数的几种方式

    JavaScript 中,有三种定义函数的方式: 1.函数语句:即使用 function 关键字显式定义函数.如: function f(x){ return x+1; }  2.函数定义表达式:也称 ...

  9. JS中创建函数的三种方式及区别

    1.函数声明 function sum1(n1,n2){ return n1+n2; }; 2.函数表达式,又叫函数字面量 var sum2=function(n1,n2){ return n1+n2 ...

随机推荐

  1. linux下使用shell发送http请求

    一.curl 1. get请求 curl命令默认下就是使用get方式发送http请求. curl www.baidu.com 2. post请求 使用-d参数,形式如下: curl -d " ...

  2. offsetHeight在不同的浏览器下取值不同

    今天在调js的时候,发现firefox和IE在取document.body.offsetHeight的值的时候结果不一样.上网查了一下,发现如下结果:   这四种浏览器分别为IE(Internet E ...

  3. this指向问题(改变它的指向)

    这个问题倒不是面向对象的,而是今天遇到js面向对象的时候一个例子的时候突然遇到了,call()方法,然后自己突然发现竟然忘记了,查了之后整理如下: xxx.call((对象名),参数a,参数b) xx ...

  4. Visual Studio调试XSLT

    Visual Studio是一个很大的工具.很容易遗漏一些有用的特性.希望XSLT调试器不会错过.在下面,您可以看到调试器正在运行,因为xslt转换正在应用于某些XML.(请原谅我在示例中使用的毫无意 ...

  5. 在VMMap中跟踪不可用的虚拟内存

    VMMap是一个很好的系统内部工具,它可以可视化特定进程的虚拟内存,并帮助理解内存的用途.它有线程堆栈.映像.Win32堆和GC堆的特定报告.有时,VMMap会报告不可用的虚拟内存,这与可用内存不同. ...

  6. ESA2GJK1DH1K基础篇: Android实现SmartConfig简单Demo

    下载源码去 百度安信可 导入源码 等待加载完 我的提示更新下软件 ,我就更新下 安装完成以后重新导入工程 安装到手机 注意,由于Android 9.0 以后的获取WIFI名称需要打开GPS,所以如果提 ...

  7. dfs與bfs常用模板

    基本遍歷: //dfs void dfs(int x) { v[x]=1; for(int i=head[x];i;i=next[i]) { int y=ver[i]; if(v[y]) contin ...

  8. [HNOI2015]亚瑟王(概率期望,DP)

    题目大意:很清晰了,不写了. $1\le T\le 444,1\le n\le 220,0\le r\le 132,0<p_i<1,0\le d_i\le 1000$. $p_i$ 和 $ ...

  9. Spring Security教程(三)

    在上一篇博客中讲解了用Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就算默认提供的表结构很复杂,也不一定能满足项 ...

  10. winform自定义分页控件

    1.控件代码: public partial class PagerControl : UserControl { #region 构造函数 public PagerControl() { Initi ...