JavaScript的面向对象编程之非构造函数的继承
这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承"。今天是最后一个部分,介绍不使用构造函数实现"继承"。一、什么是"非构造函数"的继承?比如,现在有一个对象,叫做"中国人"。 var Chinese = { nation:'中国' };还有一个对象,叫做"医生"。 var Doctor ={ career:'医生' }请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一个"中国医生"的对象?这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。二、object()方法json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点。 function object(o) { function F() {} F.prototype = o; return new F(); }这个object()函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,从而使得子对象与父对象连在一起。使用的时候,第一步先在父对象的基础上,生成子对象
JavaScript面向对象编程之构造函数的继承
这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例。今天要介绍的是,对象之间的"继承"的五种方法。比如,现在有一个"动物"对象的构造函数。function Animal(){ this.species = "动物";}还有一个"猫"对象的构造函数。function Cat(name,color){ this.name = name; this.color = color;}怎样才能使"猫"继承"动物"呢?一、 构造函数绑定第一种方法也是最简单的方法,使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行:function Cat(name,color){ Animal.apply(this, arguments); this.name = name; this.color = color;}var cat1 = new Cat("大毛","黄色");alert(cat1.species); // 动物二、 prototype模式第二种方法更常见,使用prototype属性。如果"猫"的
JavaScript的面相对象编程之封装
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢?一、 生成实例对象的原始模式假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性。var Cat = { name : '', color : ''}现在,我们需要根据这个原型对象的规格(schema),生成两个实例对象。var cat1 = {}; // 创建一个空对象cat1.name = "大毛"; // 按照原型对象的属性赋值cat1.color = "黄色";var cat2 = {};cat2.name = "二毛";cat2.color = "黑色"; 这就是最简单的封装了,把两个属性封装在一个对象里面。但是,这样的写法有两个缺点,一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有
git的使用笔记
git的使用:usage: git [--version] [--help] [-C <path>] [-c name=value] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>]available git commands in '/usr/libexec/git-core' add checkout cvsexportcommit for-each-ref init-db merge-
SQl插入数据时判断是否存在,存在则跳过,不存在则插入
SQl插入数据时判断是否存在,存在则跳过,不存在则插入insert into test(name) select 'test1' from DUAL WHERE NOT EXISTS(SELECT `name` from test where name = 'test1');test是表明,test1是要插入的内容,name是对应的字段 首次执行结果[SQL] insert into test(name) select 'test1' from DUAL WHERE NOT EXISTS(SELECT `name` from test where name = 'test1');受影响的行: 1时间: 0.002s 第二次执行结果[SQL] insert into test(name) select 'test1' from DUAL WHERE NOT EXISTS(SELECT `name` from test where name = 'test1');受影响的行: 0时间: 0.002s
MYsql 出现This function has none of DETERMINISTIC, NO SQL解决办法
完整错误描述:This function has none of DETERMINISTIC, NO SQL解决办法创建存储过程时出错信息:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) 原因:这是我们开启了bin-log, 我们就必须指定我们的函数是否是1 DETERMINISTIC 不确定的2 NO SQL 没有SQl语句,当然也不会修改数据3 READS SQL DATA 只是读取数据,当然也不会修改数据4 MODIFIES SQL DATA 要修改数据5 CONTAINS SQL 包含了SQL语句其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL D
PHP的五种设计模式
工厂模式: 最初在设计模式 一书中,许多设计模式都鼓励使用松散耦合。要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完全不相关的部分中也有可能出现级联破坏。 该问题在于紧密耦合 。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。 工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。 下面是工厂模式的一个示例。<?phpinterface IUser{ function getName();} class
NodeJS实现Http请求
PHP中可以通过CUrl请求一个链接,NodeJS中可以通过Http或Https发送请求。实现如下:http.jsvar httpServer = require("http");var queryString = require("querystring");class Http{ constructor(){ this.params = {}; this.isPost = false; this.req = null; this.hostname = ''; this.port = 80; this.urlPath = ''; this.protocol = 'http:'; this.timeout = 10000; this.headers = {}; } /** * [setParams description] * @param {Object} [params] {key:value} */ setParams(params){ this.params = queryString.stringify(params); } setHostName(
nodejs中三种变量声明方式var let const
在nodejs开发学习中,发现有let申明变量,故查询了下javascript的变量申明方式:var 申明方式;申明了一个要么是全局,要么是函数级的变量;这种是我们最常见也是最常用的。描述:1. 变量声明无论出现在代码的任何位置,都会在任何代码执行之前处理;2. 给一个非声明变量赋值会隐式创建一个全局变量(全局object的一个属性)3.如果不初始化,输出undefined或者''var https; console.log(https); //这里输出undefined或者'' let 申明方式;申明了一个块级域的局部变量,并且可以给它一个初始化值;描述:1. 与var相比let把变量的作用域限制在块级let httpz = 3; console.log(httpz); function change(){ let httpz = 6; console.log(httpz);//输出6 } change(); console.log(httpz); //输出3 const 申明方式;创建一个只读常量,在不同浏览器上表现为不可修改;建议申明后不修
C/C++开发node扩展之优化累加求和
累加求和即从最小数开始一直加到最大数,例如:1累加到100,即1+2+3......+100;普通算法for(int i = min, i <= max; i++) { sum += i;}下面是以扩展的形式开发的优化算法。#include <nan.h> void change(long long *num1, long long *num2){ *num1 = *num2 + *num1; *num2 = *num1 - *num2; *num1 = *num1 - *num2; } long long add(long long min, long long max){ if (min > max) { change(&min, &max); } long long sum = 0; long long addTimes = 0; if ((min + max) % 2 == 0) { addTimes
累加求和算法
例子:求1累加100。普通算法int sun = 0;for (int i = 1; i<100 i++){ sum = sum + i;}优化后的算法int sum =(1 + 99) * 50 + 50;如果1累加到99.int sun = 0;for (int i = 1; i<99 i++){ sum = sum + i;}优化后的算法int sum =(1 + 98) * 50;优化算法与通用算法对比#include<stdio.h>void change(int *num1, int *num2){ *num1 = *num2 + *num1; *num2 = *num1 - *num2; *num1 = *num1 - *num2;}int add(int min, int max){ if (min > max) { change(&min, &max); } int sum = 0; int addTimes = 0; if ((min + max) % 2 == 0) { addTimes = (max - min) / 2; return a
nodejs异常处理
在nodejs开发中,异常处理十分麻烦。一下代码捕捉不到错误function async_error() { setTimeout(function(){ throw new Error("Error"); },10)}function run() { try { async_error(); } catch (err) { console.log(err); }}run();在回调函数内捕获错误,我们不得不在异步函数内写错误处理语句。function async_error() { setTimeout(function(){ try{ throw new Error("Error"); }catch(e){ console.log(e); } },10)}async_error();如果函数嵌套过多,就会变成这样foo('a', function (a) { if (a.error) { throw new