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);
  1. 函数的首字母大写(用于区别构造函数和普通函数)
  2. 创建对象的过程是由new关键字实现
  3. 在构造函数内部会自动的创建新对象,并赋值给this指针
  4. 自动返回创建出来的对象

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高级:面向对象的构造函数的更多相关文章

  1. js高级-面向对象继承

    一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...

  2. JS高级 - 面向对象5(继承,引用)

    <script type="text/javascript"> //------------------Person类 //(Person)的构造函数 function ...

  3. js基础——面向对象(构造函数)

    1.面向对象:类的标志,通过类可创建多个具有相同属性和方法的对象 2.创建对象 1)工厂模式方式:避免重复实例化但未能解决识别问题  function boss(name, age) {       ...

  4. JS高级---面向对象的编程思想(贪吃蛇梳理)

    面向对象的编程思想(贪吃蛇梳理) 模拟贪吃蛇游戏,做的项目 地图: 宽,高,背景颜色,因为小蛇和食物都是相对于地图显示的, 这里小蛇和食物都是地图的子元素, 随机位置显示, 脱离文档流的, 地图也需要 ...

  5. JS高级 - 面向对象3(面向过程改写面向对象)

    改写: 1.前提:所有东西都在 onload 里 2.改写:不能有函数嵌套,可以有全局变量 onload --> 构造函数 全局变量 --> 属性 函数 --> 方法 4.改错: t ...

  6. JS高级 - 面向对象1(this,Object ,工厂方式,new )

    面向对象三要素: 封装 继承 多态 1.this 详解,事件处理中this的本质 window this -- 函数属于谁 <script type="text/javascript& ...

  7. JS高级——面向对象方式解决歌曲管理问题

    需要注意的问题: 1.其他模块若是使用构造函数MP3创建对象,唯一不同的就是他们传入的音乐库是不一样的,所以构造函数中存在一个songList属性,其他一样的就被添加到了构造函数的原型对象之中 2.原 ...

  8. JS高级 - 面向对象4(json方式面向对象)

    把方法包在一个Json里 var p1 = { name: "唐三", sex: "男", dreamdu: { URL: "www.dreamdu. ...

  9. JS高级 - 面向对象2(prototype定义)

    定义和用法 prototype 属性允许您向对象添加属性和方法 注意: Prototype 是全局属性,适用于所有的Javascript对象. 语法 object.prototype.name=val ...

  10. JS高级——面向对象方式解决tab栏切换问题

    注意事项 1.给li元素注册事件,函数里面的this指的li元素,那么我们可以在注册事件之前将Tab对象用that=this进行保存 2.使用沙箱模式,所以暴露给外面的变量使用的是window.tab ...

随机推荐

  1. PHP实现财务审核通过后返现金额到客户

    应用场景: 有这么一个返现的系统,当前端客户发起提现的时候,后端就要通过审核这笔返现订单,才可以返现到客户的账号里. 来看看下面的截图 这里的业务场景就是经过两轮审核:销售审核,财务审核都通过后,后端 ...

  2. MySQL MHA--在线主库切换(Online master switch)

    在线主库切换(Online master switch)条件 1.所有节点正常运行,无论时原主还是新主或者其他从库 if ( $#dead_servers >= 0 ) { $log->e ...

  3. 【CMDB】API传输验证

    客户端向服务器发送请求时,在请求头添加自定义的字符串 客户端的加密方式 1.对key+time进行md5加密 2.发送的时候的格式为md5_key|time,将时间也发送过去 服务器端验证 1.获取加 ...

  4. 动态规划——背包问题python实现(01背包、完全背包、多重背包)

    目录 01背包问题 完全背包问题 多重背包问题 参考: 背包九讲--哔哩哔哩 背包九讲 01背包问题 01背包问题 描述: 有N件物品和一个容量为V的背包. 第i件物品的体积是vi,价值是wi. 求解 ...

  5. PAT甲级1009水题飘过

    题目分析:简单的多项式的模拟乘法,你可以假设未知数为x,exp为x的指数,coe为x的系数,则很容易就把答案推算出来,注意答案是从指数的高往低输出,同时要注意的是这是多项式的乘法,虽然指数的范围只有0 ...

  6. Kotlin异常与Java异常的区别及注解详解

    Kotlin异常与Java异常的区别: throw的Kotlin中是个表达式,这样我们可以将throw作为Elvis表达式[val test = aa ?: bb,这样的则为Elvis表达式,表示如果 ...

  7. Python+Appium学习之启动手机APP或者浏览器

    一.启动浏览器:pycharm中python脚本如下: from appium import webdriver desired_caps ={ 'platformName':'Android', ' ...

  8. Android init介绍(下)

    上一篇请参考<Android init介绍(上)> 5. AIL 在init启动过程中,系统服务等均是通过解析rc文件来启动,而rc文件则是由Android初始化语言(Android In ...

  9. python iter()函数迭代器

    迭代器为类序列对象提供了一个类序列的接口.python的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象.迭代器用起来很灵巧,你可以迭代不是序列但表现处序列行为的对象,例如 ...

  10. LOJ P10016 灯泡 题解

    每日一题 day50 打卡 Analysis 用初中学的相似推一波式子,再用三分一搞就好了. #include<iostream> #include<cstdio> #incl ...