javascript(js)创建对象的模式与继承的几种方式
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)创建对象的模式与继承的几种方式的更多相关文章
- JS创建对象,数组,函数的三种方式
害怕自己忘记,简单总结一下 创建对象的3种方法 ①:创建一个空对象 var obj = {}; ②:对象字面量 var obj = { name: "Tom", age: 27 ...
- js实现继承的5种方式 (笔记)
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- 基础篇:1.JavaScript运行在html中,引用有几种方式?—— 6.js中常用的输出方式?
书接上文,上文提到若干条JavaScript的基础性知识,大部分都是一些概念性的东西,本着认真严谨的态度,我们要认真对待,有些条目的问题是某个知识点的周边延伸,为节约篇幅,就一起整理了,如有描述不对的 ...
- js 实现继承的6种方式(逐渐优化)
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- js 实现继承的几种方式
//js中实现继承的几种方式 //实现继承首先要有一个父类,先创造一个动物的父类 function Animal(name){ this.name = name; this.shoot = funct ...
- javascript中实现继承的几种方式
javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Chi ...
- 前端知识体系:JavaScript基础-原型和原型链-实现继承的几种方式以及他们的优缺点
实现继承的几种方式以及他们的优缺点(参考文档1.参考文档2.参考文档3) 要搞懂JS继承,我们首先要理解原型链:每一个实例对象都有一个__proto__属性(隐式原型),在js内部用来查找原型链:每一 ...
- js异步执行 按需加载 三种方式
js异步执行 按需加载 三种方式 第一种:函数引用 将所需加载方法放在匿名函数中传入 //第一种 函数引用 function loadScript(url,callback){ //创建一个js va ...
- JavaScript判断图片是否加载完成的三种方式
JavaScript判断图片是否加载完成的三种方式 有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 1 2 3 4 5 6 7 8 9 10 ...
随机推荐
- MySQL(八)之DML
昨天晚上很晚的时候才写完MySQL的常用函数,今天给大家讲一下MySQL的DML.接下来让我们直接来学习了,今天感冒了.身体很难受下午的时候要去买一波药了,不然程序员也扛不住呀. DML全称Data ...
- zookeeper原理介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt354 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它 ...
- poj 1882完全背包变形
题意:给出一个上限硬币数量s,给出n套硬币价值,求一套硬币能用不大于s数量的硬币组成从1开始连续的区间价值,其中,如果其最大值相同,输出数量小的和价值小的. 思路:很明显的完全背包,纠结后面最大值相同 ...
- 201521123008<java程序设计>第三周实验总结
1.本周学习总结 2.书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pub ...
- 201521123059 《Java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1:常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...
- 201521123023《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. (1)File可以表示一个特定文件的名称,也能表示一个目录下的一组文件的名称. (2)继承自InputStre ...
- sscanf和正则表达式
sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var ...
- SpringMVC第三篇【收集参数、字符串转日期、结果重定向、返回JSON】
业务方法收集参数 我们在Struts2中收集web端带过来的参数是在控制器中定义成员变量,该成员变量的名字与web端带过来的名称是要一致的-并且,给出该成员变量的set方法,那么Struts2的拦截器 ...
- 纳税服务系统【用户模块之使用POI导入excel、导出excel】
前言 再次回到我们的用户模块上,我们发现还有两个功能没有完成: 对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的.但是呢,在Java中操作excel是相对常用的,因此也有组件供我 ...
- 【Debian 8.8】Java 8 安装以及环境变量配置
事实上可以分为简单的三个步骤: 下载 JDK 压缩包 解压压缩包 配置环境变量 需要注意的是: 所有命令默认在 root 权限下进行! 演示环境是 Debian 8.8 64位 (阿里云学生机) 1. ...