JS高级:面向对象的构造函数
1 创建对象的方式
1.1 字面量的方式创建对象
var p1 = {
name: '张三',
run: function () {
console.log(this.name + '跑');
}
};
var p2 = {
name: '李四',
run: function () {
console.log(this.name + '跑');
}
};
console.log(p1.name);
p1.run();
console.log(p2.name);
p2.run();
1.2 内置构造函数的方式
var p1 = new Object();
p1.name = '张三';
p1.run = function () {
console.log(this.name + '跑');
}
问题:使用内置构造函数的方式和字面量的方式来创建对象差不多,都存在以下问题:
- 创建的对象无法复用,复用性差
- 如果需要创建多个同类型的对象,如(书籍)则需要写大量重复的代码,代码的冗余度高
1.3 简单工厂的方式
function createPerson(name){
var obj=new Object();//1.原料
//2.加工
obj.name=name;
obj.showName=function(){
alert(this.name);
}
return obj;//3.出厂
}
工厂里面有一些产品的模板, 只需要, 给工厂提供原材料; 工厂按照固定的加工方式, 就可以返回给外界同一类型的产品
问题:无法判定类型
1.4 自定义构造函数方式
1.4.1 普通
function Dog(name, age, dogFriends) {
// 属性
this.name = name;
this.age = age;
this.dogFriends = dogFriends;
// 行为
this.eat = function (someThing) {
console.log(this.name + '吃' + someThing);
};
this.run = function (someWhere) {
console.log(this.name + '跑' + someWhere);
}
}
// 产生对象
var smallDog = new Dog('小花', 1);
console.log(smallDog.name, smallDog.age);
- 函数的首字母大写(用于区别构造函数和普通函数)
- 创建对象的过程是由new关键字实现
- 在构造函数内部会自动的创建新对象,并赋值给this指针
- 自动返回创建出来的对象
1.4.2 参数优化
function Dog(options) {
// 属性
this.name = options.name;
this.age = options.age;
this.dogFriends = options.dogFriends;
// 方法
this.eat = function (someThing) {
console.log(this.name + '吃' + someThing);
};
this.run = function (someWhere) {
console.log(this.name + '跑' + someWhere);
}
}
1.4.3 改进
function Dog(option) {
// 属性
this.name = option.name;
this.age = option.age;
this.dogFriends = option.dogFriends;
}
Dog.prototype.eat = function (someThing) {
console.log(this.name + '吃' + someThing);
};
Dog.prototype.run = function (someWhere) {
console.log(this.name + '跑' + someWhere);
};
1.4.4 最后版
function Dog(option) {
this._init(option)
}
Dog.prototype = {
_init: function(option){
// 属性
this.name = option.name;
this.age = option.age;
this.dogFriends = option.dogFriends;
},
eat: function (someThing) {
console.log(this.name + '吃' + someThing);
},
run: function (someWhere) {
console.log(this.name + '跑' + someWhere);
}
};
1.5 矩形案例
function Rect(options) {
this._init(options)
}
Rect.prototype = {
_init: function (options) {
options = options || {};
// 放在哪里?
this.parentId = options.parentId;
// 位置
this.left = options.left || 0;
this.top = options.top || 0;
// 自身属性
this.width = options.width || 0;
this.height = options.height || 0;
this.bgColor = options.bgColor || '#000';
this.borderRadius = options.borderRadius || 0;
this.border = options.border;
},
render: function () {
// 1. 获取父标签
var parentElement = document.getElementById(this.parentId);
// 2. 创建标签
var childElement = document.createElement('div');
parentElement.appendChild(childElement);
childElement.style.position = 'absolute';
childElement.style.left = this.left + 'px';
childElement.style.top = this.top + 'px';
childElement.style.width = this.width + 'px';
childElement.style.height = this.height + 'px';
childElement.style.backgroundColor = this.bgColor;
childElement.style.border = this.border;
childElement.style.borderRadius = this.borderRadius + 'px';
}
};
// 实例化矩形对象
var rect = new Rect({
parentId:'main',
left:100,
top:200,
width:500,
height:300,
bgColor:'yellow',
border:'10px solid #000',
borderRadius:20
});
rect.render();

JS高级:面向对象的构造函数的更多相关文章
- js高级-面向对象继承
一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...
- JS高级 - 面向对象5(继承,引用)
<script type="text/javascript"> //------------------Person类 //(Person)的构造函数 function ...
- js基础——面向对象(构造函数)
1.面向对象:类的标志,通过类可创建多个具有相同属性和方法的对象 2.创建对象 1)工厂模式方式:避免重复实例化但未能解决识别问题 function boss(name, age) { ...
- JS高级---面向对象的编程思想(贪吃蛇梳理)
面向对象的编程思想(贪吃蛇梳理) 模拟贪吃蛇游戏,做的项目 地图: 宽,高,背景颜色,因为小蛇和食物都是相对于地图显示的, 这里小蛇和食物都是地图的子元素, 随机位置显示, 脱离文档流的, 地图也需要 ...
- JS高级 - 面向对象3(面向过程改写面向对象)
改写: 1.前提:所有东西都在 onload 里 2.改写:不能有函数嵌套,可以有全局变量 onload --> 构造函数 全局变量 --> 属性 函数 --> 方法 4.改错: t ...
- JS高级 - 面向对象1(this,Object ,工厂方式,new )
面向对象三要素: 封装 继承 多态 1.this 详解,事件处理中this的本质 window this -- 函数属于谁 <script type="text/javascript& ...
- JS高级——面向对象方式解决歌曲管理问题
需要注意的问题: 1.其他模块若是使用构造函数MP3创建对象,唯一不同的就是他们传入的音乐库是不一样的,所以构造函数中存在一个songList属性,其他一样的就被添加到了构造函数的原型对象之中 2.原 ...
- JS高级 - 面向对象4(json方式面向对象)
把方法包在一个Json里 var p1 = { name: "唐三", sex: "男", dreamdu: { URL: "www.dreamdu. ...
- JS高级 - 面向对象2(prototype定义)
定义和用法 prototype 属性允许您向对象添加属性和方法 注意: Prototype 是全局属性,适用于所有的Javascript对象. 语法 object.prototype.name=val ...
- JS高级——面向对象方式解决tab栏切换问题
注意事项 1.给li元素注册事件,函数里面的this指的li元素,那么我们可以在注册事件之前将Tab对象用that=this进行保存 2.使用沙箱模式,所以暴露给外面的变量使用的是window.tab ...
随机推荐
- Yii2模型介绍
通过来说,我们可以把yii2中的Mdoel分为两种: 1)数据模型: 2)表单模型: 数据模型 数据模型关联数据表,用来实现对数据的操作; 一般数据模型放在common/models下: 表单模型 表 ...
- 多线程之美6一CAS与自旋锁
1.什么是CAS CAS 即 compare and swap 比较并交换, 涉及到三个参数,内存值V, 预期值A, 要更新为的值B, 拿着预期值A与内存值V比较,相等则符合预期,将内存值V更新为B, ...
- sklearn的class_weight设置为'balanced'的计算方法
分类的时候,当不同类别的样本量差异很大时,很容易影响分类结果,因此要么每个类别的数据量大致相同,要么就要进行校正. sklearn的做法可以是加权,加权就要涉及到class_weight和sample ...
- js的insertRow和insertCell用法
js的insertRow(-1)和insertCell(-1) 增加最后一行和增加最后一列 js的insertRow(5)和insertCell(5) 第5行后增加一行和增加第5列后增加一列
- go语言笔记1
Go语言学习整理 本文基于菜鸟教程,对于自己不明白的点加了点个人注解,对于已明确的点做了删除,可能结构不太清晰,看官们可移步Go语言教程 1 Go语言结构当标识符(包括常量.变量.类型.函数名. ...
- mysql 增加列
alter table t_zhaosheng_chengji_is_finish add season_id int(4) default '1' not null COMMENT '招生季ID';
- Andrew Ng机器学习 一: Linear Regression
一:单变量线性回归(Linear regression with one variable) 背景:在某城市开办饭馆,我们有这样的数据集ex1data1.txt,第一列代表某个城市的人口,第二列代表在 ...
- 算法- 求解最大平均值的子树-经典dfs题目
给一棵二叉树,找到有最大平均值的子树.返回子树的根结点. Example 样例1 输入: {1,-5,11,1,2,4,-2} 输出:11 说明: 这棵树如下所示: 1 / \ -5 11 / \ / ...
- win10下无法安装loadrunner,提示“管理员已阻止你运行此应用”
如下图: 1.再次进入控制面板,并且选择用户账户后把最下面的[更改用户账户控制设置],里面有个滑条,把滑条拉到最下面的[从不通知]上面并且确定. 2.按[Win+R]快捷键打开运行,输入 gpedit ...
- 《BUG创造队》第八次团队作业:Alpha冲刺
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 BUG创造队 作业学习目标 (1)掌握软件测试基础技术.(2)学习 ...