//JavaScript创建对象的七种方式     
//https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%B8%83%E7%A7%8D%E6%96%B9%E5%BC%8F/ 出处
//--1.工厂模式
function createPerson(name, job) {
var o = new Object()
o.name = name
o.job = job
o.sayName = function () {
console.log(this.name)
}
return o;
}
var person1 = createPerson('Jiang', 'student');
var person2 = createPerson('X', 'Doctor');
//--//-- //--2.使用构造函数创建对象
function Person() { }
var person1 = new Person() //new关键字 后边必须是函数名
person1.name = 'Jiang';
console.log(person1.name) //Jiang person1 instanceof Object // true //使用这个方式创建对象可以检测对象类型
person1 instanceof Person //true
//--//-- //--3.原型模式
function Person() {
}
Person.prototype.name = 'Jiang';
Person.prototype.job = 'student';
Person.prototype.sayName = function () {
console.log(this.name)
}
var person1 = new Person()
//--//-- //--4.更简单的写法
function Person() {
}
Person.prototype = {
name: 'Jiang',
job: 'student',
sayName: function () {
console.log(this.name)
}
}
var person1 = new Person(); //将Person.prototype设置为等于一个以对象字面量形式创建的对象,但是会导致.constructor不在指向Person了。 Person.prototype.constructor === Person // false //使用这种方式,完全重写了默认的Person.prototype对象,因此 .constructor也不会存在这里 //如果需要 constructor 这个属性的话,可以手动添加
function Person() {
}
Person.prototype = {
constructor:Person,
name: 'Jiang',
job: 'student',
sayName: function() {
console.log(this.name);
}
}; function Person() {
}
Person.prototype = {
name: 'jiang',
friends: ['Shelby', 'Court']
}
var person1 = new Person();
var person2 = new Person();
person1.friends.push('Van');
console.log(person1.friends) //[“Shelby”, “Court”, “Van”]
console.log(person2.friends) //[“Shelby”, “Court”, “Van”]
console.log(person1.friends === person2.friends) // true //friends存在与原型中,实例person1和person2指向同一个原型,person1修改了引用的数组,也会反应到实例person2中
//--//-- //--5.组合使用构造函数模式和原型模式
function Person(name) {
this.name = name;
this.friends = ['Shelby', 'Court'];
}
Person.prototype.sayName = function () {
console.log(this.name);
}
var person1 = new Person();
var person2 = new Person();
person1.friends.push('Van');
console.log(person1.friends); //[“Shelby”, “Court”, “Van”]
console.log(person2.friends);// [“Shelby”, “Court”]
console.log(person1.friends === person2.friends); //false
//--//-- //--6.动态原型模式
function Person(name, job) {
// 属性
this.name = name;
this.job = job;
// 方法
if (typeof this.sayName !== 'function') {
Person.prototype.sayName = function () {
console.log(this.name);
}
}
}
var person1 = new Person('Jiang', 'Student')
person1.sayName(); ///只有在sayName方法不存在的时候,才会将它添加到原型中。这段代码只会初次调用构造函数的时候才会执行。
//--//-- //--7.寄生构造函数模式
function Person(name, job) {
var o = new Object()
o.name = name;
o.job = job;
o.sayName = function () {
console.log(this.name);
}
return o;
}
var person1 = new Person('Jiang', 'student');
person1.sayName(); //这个模式,除了使用new操作符并把使用的包装函数叫做构造函数之外,和工厂模式几乎一样
//构造函数如果不返回对象,默认也会返回一个新的对象,通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时返回的值
//--//--

最新文章

  1. [DeviceOne开发]-do_LinearLayout组件使用技巧
  2. ionic 通过PouchDB + SQLite来实现app的本地存储(Local Storage)
  3. php用smtp发送邮件
  4. vc++ 判断文件或是文件夹是否存在,比较好的做法
  5. leetcode 119 Pascal's Triangle II ----- java
  6. 【转】关于B/S架构应用程序的权限设置分析和总结
  7. 反向代理代理百度、google
  8. div+css之清除浮动
  9. Android应用启动画面
  10. Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API
  11. SOUI开发应用展示2
  12. 容器加載Web工程的Web.xml文件介紹
  13. python笔记22-常用模块
  14. element UI table 过滤 筛选问题
  15. Django模板语言相关内容 Djan
  16. tab键设置为空4格和自动缩进
  17. HSQL可视化工具
  18. Java 基础 面向对象之构造方法和关键字
  19. 记一次隐秘的XSS漏洞挖掘
  20. linux (centos 6.4)下编译安装git

热门文章

  1. 09.正则表达式re-1.正则表达式
  2. 12.IDEA中自动导资源包
  3. 与公司2位经理的交流,Web开发知识库建设
  4. 【Codeforces 933A】A Twisty Movement
  5. 0804关于mysql 索引自动优化机制: 索引选择性(Cardinality:索引基数)
  6. SpringBoot支持AJAX跨域请求
  7. 洛谷 P3252 [JLOI2012]树
  8. 刚開始学习的人非常有用:struts2中将jsp数据传到action的几种方式
  9. 64位只有一种调用约定stdcall
  10. luogu4180 次小生成树Tree 树上倍增