1.js创建对象的几种方式

工厂模式

为什么会产生工厂模式,原因是使用同一个接口创建很多对象,会产生大量的重复代码,为了解决这个问题,产生了工厂模式。

function createPerson(name,age,job){

var o=new Object();

o.name=name;

o.age=age;

o.job=job;

o.sayName=function(){

console.log(this.name);

}

return o;

}

var person1=createPerson("kobe","34","player");

var person2=createPerosn("patty","32","singer");

构造函数模式

与工厂模式不同的是,没有显示的创建对象,直接将属性和方法赋值this对象,没有return语句。

function Person(name,age,job){

this.name=name;

this.age=age;

this.job=job;

this.sayName=function(){

console.log(this.name);

};

}

var person1=new Person();

var person2=new Person();

console.log(person1.sayName==person2.sayName)//false 说明不同实例的同名函数是不相等的

如果我们想要的结果是两者相等,可以这样实现

function  Person(name,age,job){

this.name=name;

this.age=age;

this.job=job;

this.sayName=sayName;

}

function sayName(){

console.log(this.name);

}

var person1=new Person();

var person2=new Person();

console.log(person1.sayName==person2.sayName);//true

创建Person的新实例,需要用到new操作符,这种方式下调用构造函数会经历四个阶段,分别是:

创建一个新对象

将构造函数的作用域赋值给这个新的对象

执行构造函数中的代码

返回新对象

person1和person2这两个对象都有一个constructor属性,该属性指向Person

console.log(person1.constructor==Person);//true

console.log(person2.constructor==Person);//true

原型模式

特点:新对象的这些属性和方法是所有实例共享的

function Person(){

}

Person.prototype.name="kobe";

Person.prototype.age=38;

Person.prototype.sayName=function(){

console.log(this.name);

}

var person1=new Person();

var person2=new Person();

console.log(person1.sayName==person2.sayName);//true

有时候我们想知道该属性到底是存在对象中还是存在原型中,可以使用以下方法

我们使用in操作符和hasOwnProperty结合判断

"name" in object无论该属性到底存在原型中还是对象中,都会返回true

而hasOwnProperty只有存在实例中才返回true

so:只有in操作符返回true,而hasOwnProperty返回false,能确定属性是原型中的属性。

function hasPrototypeProperty(object,name){

return !object.hasOwnProperty(name)&&(name in object);

}

原型对象存在问题,牵一发而动全身

function Person(){

}

Perosn.prototype=function(){

constructor;Person,

name:"kobe",

age:"29",

job:"player",

friends:["shely","count"],

sayName:function(){

console.log(this.name);

}

};

var person1=new Person();

var person2=new Person();

person1.friends.push("ann");

console.log(person1.friends===person2.friends);//true

解决的方法:是使用构造函数模式和原型模式

function Person(name,age,job){

this.name=name;

this.age=age;

this.job=job;

this.friends=["she","ya"];

}

Person.prototype={

constructor:Person,

sayName:function(){

console.log(this.name);

}

};

var person1=new Person();

var person2=new Person();

person1.friends.push("VAN");

console.log(person1.friends===person2.friends);//false

动态原型模式

function Person(name,age,job){

this.name=name;

this.age=age;

this.job=job;

if(typeof this.sayName!="function"){

Person.prototype.sayName=function(){

console.log(this.name);

}

};

}

寄生构造函数模式

function Person(name,age,job){

var o=new Object();

o.name=name;

o.age=age;

o.job=job;

o.sayName=function(){

console.log(this.name);

};

return o;

}

var friend=new Person();//此模式与工厂模式十分类似

2.js实现继承的几种方式

原型链继承:原型对象属性共享

function Parent2(){

this.name="kobe";

this.play=[1,2,3];

}

function Child2(){

this.type="children";

}

Child2.prototype=new Parent2();

var say1=new Child2();

var say2=new Child2();

say1.play.push("van");

console.log(say1.play==say2.play);//true

借用构造函数实现继承:无法实现继承原型对象

function Parent1(){

this.name="kobe";

}

Parent1.prototype.age=90;

function Child(){

Parent1.call(this);

this.type="service";

}

var say=new Child();

console.log();//error

组合式继承

function Parent4(name){

this.name="kobe";

this.play=[1,2,3];

}

Parent4.prototype.sayName=function(){

}

function Child4(name,age){

Parent3.call(this,name);

this.age=age;

}

Child4.prototype=new Parent4();

Child4.prototype.constructor=Child4;

Child4.prototype.sayAge=function(){

console.log(this.age);

};

var ins1=new Child4();

var ins2=new Child4();

ins1.push.push(4);

console.log(ins1.play==ins2.play);//false

原型式继承

function object(){

function F(){}

F.prototype=o;

return new F();

}

var person={

name:"kobe",

friends;["yang","du","geng"]

};

var onePerson=object(person);

var twoPerson=object(person);

寄生式继承

function object(o){

function F(){}

F.prototype=o;

return new F();

}

function create(o){

var clone=object(o);

clone.sayHi=function(){

console.log("hi");

};

return clone;

}

var person={

name:"kobe",

friends:["james","waston","sun"]

};

var anotherPerson=creat(person);

anotherPerson.sayHi();//hi

寄生式组合继承

function inheritPrototype(Child5,Parent5){
    var prototype=Object(Parent5.prototype);
    prototype.constructor=Child5;
    Child5.prototype=prototype;
}
function Parent5(name){
    this.name=name;
    this.colors=["red","blue","green"];
}
Parent5.prototype.sayName=function(){
    console.log(this.name);
};
function Child5(name,age){
    Parent5.call(this.name);
    this.age=age;
}
inheritPrototype(Child5,Parent5);
Child5.prototype.sayAge=function(){
     console.log(this.age);
};

javascript(js)创建对象的模式与继承的几种方式的更多相关文章

  1. JS创建对象,数组,函数的三种方式

    害怕自己忘记,简单总结一下 创建对象的3种方法 ①:创建一个空对象   var obj = {}; ②:对象字面量 var obj = { name: "Tom", age: 27 ...

  2. js实现继承的5种方式 (笔记)

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  3. 基础篇:1.JavaScript运行在html中,引用有几种方式?—— 6.js中常用的输出方式?

    书接上文,上文提到若干条JavaScript的基础性知识,大部分都是一些概念性的东西,本着认真严谨的态度,我们要认真对待,有些条目的问题是某个知识点的周边延伸,为节约篇幅,就一起整理了,如有描述不对的 ...

  4. js 实现继承的6种方式(逐渐优化)

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  5. js 实现继承的几种方式

    //js中实现继承的几种方式 //实现继承首先要有一个父类,先创造一个动物的父类 function Animal(name){ this.name = name; this.shoot = funct ...

  6. javascript中实现继承的几种方式

    javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Chi ...

  7. 前端知识体系:JavaScript基础-原型和原型链-实现继承的几种方式以及他们的优缺点

    实现继承的几种方式以及他们的优缺点(参考文档1.参考文档2.参考文档3) 要搞懂JS继承,我们首先要理解原型链:每一个实例对象都有一个__proto__属性(隐式原型),在js内部用来查找原型链:每一 ...

  8. js异步执行 按需加载 三种方式

    js异步执行 按需加载 三种方式 第一种:函数引用 将所需加载方法放在匿名函数中传入 //第一种 函数引用 function loadScript(url,callback){ //创建一个js va ...

  9. JavaScript判断图片是否加载完成的三种方式

    JavaScript判断图片是否加载完成的三种方式 有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 1 2 3 4 5 6 7 8 9 10 ...

随机推荐

  1. poj 3635 带花费的Dij+head优化

    练习!! 这里主要需要注意的是进队的条件和dp[][]状态的控制,dp[i][j]表示到第i个城市剩余汽油为j的最小花费. 代码: #include<iostream> #include& ...

  2. java初阶

    java的开发工具分成 IDE(integrated developmentenvironment )和JDk(Java Development Kit) 一个.java中只能有一个public类且至 ...

  3. mpls vpn剩余笔记

    将IP地址映射为简单的具有固定长度的标签 用于快速数据包交换 20 3 1 8 在整个转发过程中,交换节点仅根据标记进行转发 标签交换路径(LSP) 多协议标签交换MPLS最初是为了提高转发速度而提出 ...

  4. ★RFC标准库_目录链接

    RFC(Request For Comments)是一个国际标准化的数据库,记录了从计算机到互联网的海量标准协议.它是一个免费公开的IT标准文件分享平台,其内容也在不断增长,与时俱进.它与ISO等组织 ...

  5. UX是什么?

    UX(用户体验),操作过安卓手机或者苹果手机的系统吧?那么操作过程的整体体验就叫UX,而操作过程中所看到的界面颜色啦,图案,字体大小啦等等都属于UI设计,而交互设计(Interaction Desig ...

  6. 事后诸葛亮分析(Beta阶段)

    设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决用户想要随时锻炼四则运算能力的问题:定义的很清楚:有清晰描述. 2.是否有充足的时间来做计划? ...

  7. [转载] java中静态代码块的用法 static用法详解

    一.java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...

  8. 201521123034《Java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  9. 201521123063 《java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  10. 使用Eclipse Egit与码云管理你的代码

    总体流程: 建立远程仓库 建立本地仓库并与远程仓库关联 将Eclipse中的项目提交到本地仓库并进而push到远程仓库 一. 配置Eclipse EGit 图解Eclipse中安装及配置EGit插件中 ...