name字符串类型,age类型是number,函数没有返回值就是void
js设计模式(js设计模式面试题)
Android开发是指Android平台上应用的制作,Android早期由“Android之父”之称的Andy Rubin创办,Google于2005年并购了成立仅22个月的高科技Android,展开了短信、手机检索、定位等业务,基于Linux的通用平台进入了开发。
软件开发需要掌握的知识体系有:Uinx/Linux平台技术、企业级数据库技术、ja语言核心技术、软件工程和设计模式、Android应用开发基础、互联网核心技术、Android系统级开发、jaEE核心技术。
web前端开发工程师是一个很新的职业,是从事web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。
以前会Photoshop和Dreamweer就可以制作网页,系只能在只掌握这些已经远远不够了。无论是开发难度上,还是开发方式上,现在的网页制作更接近传统的网站后台开发,所以现在不要再叫网页制作,而是web前端开发。web前端开发在产品开发环节中的作用变得越来越重要,而且需要专业的前端工程师才能做好,这方面的专业人才近两年来备受青睐。web前端开发是一项很特殊的工作,涵盖的知识面非常广,既有具体的技术,又有抽象的理念。简单地说,它的主要职能就是把网站的界面更好的呈现给用户。
前端的难度相对要小很多,很多人都不认为前端算是程序员(链的底部,仅专略高于美工UI),觉得那属不过是HTML。
不过同级别的薪资也不如安卓、ios开发。但是人才市场上前端更稀缺,因为从业者相对于需求来说更少,很少专门的培训班,主要要靠兴趣自学。
如果有耐心和毅力,长远上看iOS开发更好,iphone开发未来几年还是很被重视的,程序员可以升级到CTO等级别。如果想快速的话就前端吧。当然先前端后再学手机开发也可以,技多不压身。
最简单的者模式
// Observer
class Observer {
constructor (data) {
this.walk(data)
}
walk (data) {
// 遍历
let keys = Object.keys(data)
for(let i = 0; i < keys.length; i++){
defineReactive(data, keys[i], data[keys[i]])
}
}
}
function defineReactive (data, key, val) {
observer(val)
// dep 为什么要在这里实例化, 就是为了实现, 对象每一层的 每一个key都有自己的一个实例, 比如 a.b 对应 dep1, a.c 对应dep2, 这里虽然都是let dep = new Dep()
// 但每次来到这个方法, dep都是的, 会一直保留在内存. 这样在每次调用set方法都能找到这个a.b对应的dep
// dep 这里会一直保存, 是因为闭包的关系, Object这个全局的函数, 引用了上层的作用域, 这个作用域包含了 dep, 除非Object = null, 或者退出浏览器, dep才会消失
//实例化之后, dep就有了被, 和发布消息的功能, dep不写在这里也是可以的, 多定义一个全局函数, 每次obser的时候增加一个dep
let dep = new Dep()
Object.defineProperty(data, key, {
enumerable: true,
configurable: true,
get: function () {
//每次new Watch('a.b'), 都会先执行get方法, 进而来到这里, 触发 dep.depend(), 这个dep就是 a.b 对应的 ,
dep.depend()
return val
},
set: function (newVal) {
if(val === newVal){
return
require 函数用来在一个模块中引入另外一个模块。传入一个模块名,返回一个模块导出对象。用法: let cc = require("模块名") ,其中模块名可以用路径也可以用相对路径,模块的后缀名.js可以省略。例如:
require()函数用两个作用:
exports 对象用来导出当前模块的公共方法或属性,别的模块通过 require 函数使用当前模块时得到的就是当前模块的 exports 对象。用法: exports.name ,name为导出的对象名。例子:
module.exports 用来导出一个默认对象,没有指定对象名,常见于修改模块的原始导出对象。比如原本模块导出的是一个对象,我们可以通过module.exports修改为导出一个函数。如下:
3.加载第三方包
Node.js中使用 CommonJs 模块化机制,通过 npm 下载的第三方包,我们在项目中引入第三方包都是: let xx = require('第三方包名') ,究竟 require 方法加载第三方包的原理机制是什么,今天我们来探讨下。
require('第三方包名') 优先在加载该包的模块的同级目录 node_modules 中查找第三方包。
找到该第三方包中的 package.json 文件,并且找到里面的 main 属性对应的入口模块,该入口模块即为加载的第三方模块。
如果在要加载的第三方包中没有找到 package.json 文件或者是 package.json 文件中没有 main 属性,则默认加载第三方包中的 index.js 文件。
如果在加载第三方模块的文件的同级目录没有找到 node_modules 文件夹,或者以上所有情况都没有找到,则会向上一级父级目录下查找 node_modules 文件夹,查找规则如上一致。
如果一直找到该模块的磁盘根路径都没有找到,则会报错: can not find module xxx 。
4.npm命令
npm 英文全称: node package mar ,npm 为你和你的团队打开了连接整个 JaScript 天才世界的一扇大门。它是世界上的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。我们平时开发项目都是需要使用npm下载依赖,常见的npm命令总结如下:
5.文件读取
var fs = require('fs')
同步:
var content = fs.readFileSync('hello.txt',{flag:'r',encoding:"utf-8"})
异步(默认):
flag:读取模式
encoding:编码格式
7.文件写入
var fs = require('fs')
格式:write=>w read=>r append =>a
异步:
8.文件删除
fs . unlink ( 'lc.txt' , function (){
9.buffer缓冲区
1、数组不能进行二进制数据的作2、js数组不像ja、python等语言效率高3、buffer内存空间开辟出固定大小的内存
let buf1 = Buffer.alloc(10)
console.log(buf1)
allocUnsafe(之前的一些内容)(效率高)
10.文件目录
var fs = require('fs')
fs.readdir(path,callback)
导入 readline 包
let readline = require('readline');
实例化接口对象(process对象,stdout/in输入输出)
question方法 提问
close
11.文件流
var fs = require('fs')
语法: fs.createWriteStream(文件路径,【可选的配置作】)
let ws = fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
let ws = fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
实践
fs.createReadStream(路径,【可选的配置项】)
文档
let rs = fs.createReadStream('hello.txt',{flags:'r',encoding:"utf-8"})
音乐
let rs = fs.createReadStream('snake.mp4',{flags:'r'})
读取时写入
let ws = fs.createWriteStream('a.txt',{flags:"w",encoding:"utf-8"})
createReadStream.pipe(createWriteStream)
链式是通过连接输出流到另外一个流并创建多个流作链的机制。链式流一般用于管道作。
接下来我们就是用管道和链式来压缩和解压文件。
创建 compress.js 文件, 代码如下:
代码执行结果如下:
执行完以上作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz。
接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:
12.node
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 几乎每一个 API 都是支持回调函数的。
Node.js 基本上所有的机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的循环,直到没有观察者退出,每个异步都生成一个观察者,如果有发生就调用该回调函数.
没有使用 nts 包 仅使用JaScript进行驱动
Node.js 使用驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写作。(这也称之为非阻塞式IO或者驱动IO)
在驱动模型中,会生成一个主循环来,当检测到时触发回调函数。
Node.js 有多个内置的,我们可以通过引入 nts 模块,并通过实例化 EventEmitter 类来绑定和,如下实例:
以下程序绑定处理程序:
我们可以通过程序触发:
接下来让我们执行以上代码:
在 Node 应用程序中,执行异步作的函数将回调函数作为一个参数, 回调函数接收错误对象作为个参数。
接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:
创建 main.js 文件,代码如下:
以上程序中 fs.readFile() 是异步函数用于读取文件。如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。
如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。
执行以上代码,执行结果如下:
接下来我们删除 input.txt 文件,执行结果如下所示:
因为文件 input.txt 不存在,所以输出了错误信息。
Node.js 所有的异步 I/O 作在完成时都会发送一个到队列。
Node.js 里面的许多对象都会分发:一个 net. 对象会在每次有新连接时触发一个, 一个 fs.readStream 对象会在文件被打开的时候触发一个。所有这些产生的对象都是 nts.EventEmitter 的实例。
nts 模块只提供了一个对象:nts.EventEmitter。EventEmitter 的核心就是触发与功能的封装。
你可以通过require("nts");来访问该模块。
EventEmitter 对象如果在实例化时发生错误,会触发 error 。当添加新的时,newListener 会触发,当被移除时,removeListener 被触发。
下面我们用一个简单的例子说明 EventEmitter 的用法:
执行结果如下:
运行这段代码,1 秒后控制台输出了 'some_nt 触发' 。其原理是 nt 对象注册了 some_nt 的一个,然后我们通过 setTimeout 在 1000 毫秒以后向 nt 对象发送 some_nt,此时会调用some_nt 的。
EventEmitter 的每个由一个名和若干个参数组成,名是一个字符串,通常表达一定的语义。对于每个,EventEmitter 支持 若干个。
当触发时,注册到这个的被依次调用,参数作为回调函数参数传递。
让我们以下面的例子解释这个过程:
执行以上代码,运行的结果如下:
以上例子中,emitter 为 someEvent 注册了两个,然后触发了 someEvent 。
运行结果中可以看到两个回调函数被先后调用。这就是EventEmitter最简单的用法。
EventEmitter 提供了多个属性,如 on 和 emit 。 on 函数用于绑定函数, emit 属性用于触发一个。接下来我们来具体看下 EventEmitter 的属性介绍。
观察者模式主要应用于对象之间一对多的依赖关系,当一个对象发生改变时,多个对该对象有依赖的其他对象也会跟着做出相应改变,这就非常适合用观察者模式来实现。使用观察者模式可以根据需要增加或删除对象,解决一对多对象间的耦合关系,使程序更易于扩展和维护。
基础知识:
观察者模式定义了对象间的一种一对多依赖关系,每当一个对象发生改变时,其相关依赖对象皆得到通知并被进行相应的改变。观察者模式又叫做发布-模式。生活中有很多类似的关系,比如微信公众号,多个读者一个微信公众号,一旦公众号有更新,多个读者都会收到更新,而这种情况在应用程序中也非常常见,js绑定各种本质上就是观察者模式的实现。
观察者模式是一个非常有用的设计模式,它主要有两个角色组成:
(1)目标对象:作为一对多关系中的一,可以用来管理观察者的增加和删除。
(2)观察者对象:观察目标对象,一旦目标发生改变则做出相应的反应。
更多详解查看:
name字符串类型,age类型是number,函数没有返回值就是void
Android开发是指Android平台上应用的制作,Android早期由“Android之父”之称的Andy Rubin创办,Google于2005年并购了成立仅22个月的高科技Android,展开了短信、手机检索、定位等业务,基于Linux的通用平台进入了开发。
软件开发需要掌握的知识体系有:Uinx/Linux平台技术、企业级数据库技术、ja语言核心技术、软件工程和设计模式、Android应用开发基础、互联网核心技术、Android系统级开发、jaEE核心技术。
web前端开发工程师是一个很新的职业,是从事web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。
以前会Photoshop和Dreamweer就可以制作网页,系只能在只掌握这些已经远远不够了。无论是开发难度上,还是开发方式上,现在的网页制作更接近传统的网站后台开发,所以现在不要再叫网页制作,而是web前端开发。web前端开发在产品开发环节中的作用变得越来越重要,而且需要专业的前端工程师才能做好,这方面的专业人才近两年来备受青睐。web前端开发是一项很特殊的工作,涵盖的知识面非常广,既有具体的技术,又有抽象的理念。简单地说,它的主要职能就是把网站的界面更好的呈现给用户。
前端的难度相对要小很多,很多人都不认为前端算是程序员(链的底部,仅专略高于美工UI),觉得那属不过是HTML。
不过同级别的薪资也不如安卓、ios开发。但是人才市场上前端更稀缺,因为从业者相对于需求来说更少,很少专门的培训班,主要要靠兴趣自学。
如果有耐心和毅力,长远上看iOS开发更好,iphone开发未来几年还是很被重视的,程序员可以升级到CTO等级别。如果想快速的话就前端吧。当然先前端后再学手机开发也可以,技多不压身。
最简单的者模式
// Observer
class Observer {
constructor (data) {
this.walk(data)
}
walk (data) {
// 遍历
let keys = Object.keys(data)
for(let i = 0; i < keys.length; i++){
defineReactive(data, keys[i], data[keys[i]])
}
}
}
function defineReactive (data, key, val) {
observer(val)
// dep 为什么要在这里实例化, 就是为了实现, 对象每一层的 每一个key都有自己的一个实例, 比如 a.b 对应 dep1, a.c 对应dep2, 这里虽然都是let dep = new Dep()
// 但每次来到这个方法, dep都是的, 会一直保留在内存. 这样在每次调用set方法都能找到这个a.b对应的dep
// dep 这里会一直保存, 是因为闭包的关系, Object这个全局的函数, 引用了上层的作用域, 这个作用域包含了 dep, 除非Object = null, 或者退出浏览器, dep才会消失
//实例化之后, dep就有了被, 和发布消息的功能, dep不写在这里也是可以的, 多定义一个全局函数, 每次obser的时候增加一个dep
let dep = new Dep()
Object.defineProperty(data, key, {
enumerable: true,
configurable: true,
get: function () {
//每次new Watch('a.b'), 都会先执行get方法, 进而来到这里, 触发 dep.depend(), 这个dep就是 a.b 对应的 ,
dep.depend()
return val
},
set: function (newVal) {
if(val === newVal){
return
require 函数用来在一个模块中引入另外一个模块。传入一个模块名,返回一个模块导出对象。用法: let cc = require("模块名") ,其中模块名可以用路径也可以用相对路径,模块的后缀名.js可以省略。例如:
require()函数用两个作用:
exports 对象用来导出当前模块的公共方法或属性,别的模块通过 require 函数使用当前模块时得到的就是当前模块的 exports 对象。用法: exports.name ,name为导出的对象名。例子:
module.exports 用来导出一个默认对象,没有指定对象名,常见于修改模块的原始导出对象。比如原本模块导出的是一个对象,我们可以通过module.exports修改为导出一个函数。如下:
3.加载第三方包
Node.js中使用 CommonJs 模块化机制,通过 npm 下载的第三方包,我们在项目中引入第三方包都是: let xx = require('第三方包名') ,究竟 require 方法加载第三方包的原理机制是什么,今天我们来探讨下。
require('第三方包名') 优先在加载该包的模块的同级目录 node_modules 中查找第三方包。
找到该第三方包中的 package.json 文件,并且找到里面的 main 属性对应的入口模块,该入口模块即为加载的第三方模块。
如果在要加载的第三方包中没有找到 package.json 文件或者是 package.json 文件中没有 main 属性,则默认加载第三方包中的 index.js 文件。
如果在加载第三方模块的文件的同级目录没有找到 node_modules 文件夹,或者以上所有情况都没有找到,则会向上一级父级目录下查找 node_modules 文件夹,查找规则如上一致。
如果一直找到该模块的磁盘根路径都没有找到,则会报错: can not find module xxx 。
4.npm命令
npm 英文全称: node package mar ,npm 为你和你的团队打开了连接整个 JaScript 天才世界的一扇大门。它是世界上的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。我们平时开发项目都是需要使用npm下载依赖,常见的npm命令总结如下:
5.文件读取
var fs = require('fs')
同步:
var content = fs.readFileSync('hello.txt',{flag:'r',encoding:"utf-8"})
异步(默认):
flag:读取模式
encoding:编码格式
7.文件写入
var fs = require('fs')
格式:write=>w read=>r append =>a
异步:
8.文件删除
fs . unlink ( 'lc.txt' , function (){
9.buffer缓冲区
1、数组不能进行二进制数据的作2、js数组不像ja、python等语言效率高3、buffer内存空间开辟出固定大小的内存
let buf1 = Buffer.alloc(10)
console.log(buf1)
allocUnsafe(之前的一些内容)(效率高)
10.文件目录
var fs = require('fs')
fs.readdir(path,callback)
导入 readline 包
let readline = require('readline');
实例化接口对象(process对象,stdout/in输入输出)
question方法 提问
close
11.文件流
var fs = require('fs')
语法: fs.createWriteStream(文件路径,【可选的配置作】)
let ws = fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
let ws = fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
实践
fs.createReadStream(路径,【可选的配置项】)
文档
let rs = fs.createReadStream('hello.txt',{flags:'r',encoding:"utf-8"})
音乐
let rs = fs.createReadStream('snake.mp4',{flags:'r'})
读取时写入
let ws = fs.createWriteStream('a.txt',{flags:"w",encoding:"utf-8"})
createReadStream.pipe(createWriteStream)
链式是通过连接输出流到另外一个流并创建多个流作链的机制。链式流一般用于管道作。
接下来我们就是用管道和链式来压缩和解压文件。
创建 compress.js 文件, 代码如下:
代码执行结果如下:
执行完以上作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz。
接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:
12.node
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 几乎每一个 API 都是支持回调函数的。
Node.js 基本上所有的机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的循环,直到没有观察者退出,每个异步都生成一个观察者,如果有发生就调用该回调函数.
没有使用 nts 包 仅使用JaScript进行驱动
Node.js 使用驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写作。(这也称之为非阻塞式IO或者驱动IO)
在驱动模型中,会生成一个主循环来,当检测到时触发回调函数。
Node.js 有多个内置的,我们可以通过引入 nts 模块,并通过实例化 EventEmitter 类来绑定和,如下实例:
以下程序绑定处理程序:
我们可以通过程序触发:
接下来让我们执行以上代码:
在 Node 应用程序中,执行异步作的函数将回调函数作为一个参数, 回调函数接收错误对象作为个参数。
接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:
创建 main.js 文件,代码如下:
以上程序中 fs.readFile() 是异步函数用于读取文件。如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。
如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。
执行以上代码,执行结果如下:
接下来我们删除 input.txt 文件,执行结果如下所示:
因为文件 input.txt 不存在,所以输出了错误信息。
Node.js 所有的异步 I/O 作在完成时都会发送一个到队列。
Node.js 里面的许多对象都会分发:一个 net. 对象会在每次有新连接时触发一个, 一个 fs.readStream 对象会在文件被打开的时候触发一个。所有这些产生的对象都是 nts.EventEmitter 的实例。
nts 模块只提供了一个对象:nts.EventEmitter。EventEmitter 的核心就是触发与功能的封装。
你可以通过require("nts");来访问该模块。
EventEmitter 对象如果在实例化时发生错误,会触发 error 。当添加新的时,newListener 会触发,当被移除时,removeListener 被触发。
下面我们用一个简单的例子说明 EventEmitter 的用法:
执行结果如下:
运行这段代码,1 秒后控制台输出了 'some_nt 触发' 。其原理是 nt 对象注册了 some_nt 的一个,然后我们通过 setTimeout 在 1000 毫秒以后向 nt 对象发送 some_nt,此时会调用some_nt 的。
EventEmitter 的每个由一个名和若干个参数组成,名是一个字符串,通常表达一定的语义。对于每个,EventEmitter 支持 若干个。
当触发时,注册到这个的被依次调用,参数作为回调函数参数传递。
让我们以下面的例子解释这个过程:
执行以上代码,运行的结果如下:
以上例子中,emitter 为 someEvent 注册了两个,然后触发了 someEvent 。
运行结果中可以看到两个回调函数被先后调用。这就是EventEmitter最简单的用法。
EventEmitter 提供了多个属性,如 on 和 emit 。 on 函数用于绑定函数, emit 属性用于触发一个。接下来我们来具体看下 EventEmitter 的属性介绍。
name字符串类型,age类型是number,函数没有返回值就是void
Android开发是指Android平台上应用的制作,Android早期由“Android之父”之称的Andy Rubin创办,Google于2005年并购了成立仅22个月的高科技Android,展开了短信、手机检索、定位等业务,基于Linux的通用平台进入了开发。
软件开发需要掌握的知识体系有:Uinx/Linux平台技术、企业级数据库技术、ja语言核心技术、软件工程和设计模式、Android应用开发基础、互联网核心技术、Android系统级开发、jaEE核心技术。
web前端开发工程师是一个很新的职业,是从事web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。
以前会Photoshop和Dreamweer就可以制作网页,系只能在只掌握这些已经远远不够了。无论是开发难度上,还是开发方式上,现在的网页制作更接近传统的网站后台开发,所以现在不要再叫网页制作,而是web前端开发。web前端开发在产品开发环节中的作用变得越来越重要,而且需要专业的前端工程师才能做好,这方面的专业人才近两年来备受青睐。web前端开发是一项很特殊的工作,涵盖的知识面非常广,既有具体的技术,又有抽象的理念。简单地说,它的主要职能就是把网站的界面更好的呈现给用户。
前端的难度相对要小很多,很多人都不认为前端算是程序员(链的底部,仅专略高于美工UI),觉得那属不过是HTML。
不过同级别的薪资也不如安卓、ios开发。但是人才市场上前端更稀缺,因为从业者相对于需求来说更少,很少专门的培训班,主要要靠兴趣自学。
如果有耐心和毅力,长远上看iOS开发更好,iphone开发未来几年还是很被重视的,程序员可以升级到CTO等级别。如果想快速的话就前端吧。当然先前端后再学手机开发也可以,技多不压身。
最简单的者模式
// Observer
class Observer {
constructor (data) {
this.walk(data)
}
walk (data) {
// 遍历
let keys = Object.keys(data)
for(let i = 0; i < keys.length; i++){
defineReactive(data, keys[i], data[keys[i]])
}
}
}
function defineReactive (data, key, val) {
observer(val)
// dep 为什么要在这里实例化, 就是为了实现, 对象每一层的 每一个key都有自己的一个实例, 比如 a.b 对应 dep1, a.c 对应dep2, 这里虽然都是let dep = new Dep()
// 但每次来到这个方法, dep都是的, 会一直保留在内存. 这样在每次调用set方法都能找到这个a.b对应的dep
// dep 这里会一直保存, 是因为闭包的关系, Object这个全局的函数, 引用了上层的作用域, 这个作用域包含了 dep, 除非Object = null, 或者退出浏览器, dep才会消失
//实例化之后, dep就有了被, 和发布消息的功能, dep不写在这里也是可以的, 多定义一个全局函数, 每次obser的时候增加一个dep
let dep = new Dep()
Object.defineProperty(data, key, {
enumerable: true,
configurable: true,
get: function () {
//每次new Watch('a.b'), 都会先执行get方法, 进而来到这里, 触发 dep.depend(), 这个dep就是 a.b 对应的 ,
dep.depend()
return val
},
set: function (newVal) {
if(val === newVal){
return
name字符串类型,age类型是number,函数没有返回值就是void
Android开发是指Android平台上应用的制作,Android早期由“Android之父”之称的Andy Rubin创办,Google于2005年并购了成立仅22个月的高科技Android,展开了短信、手机检索、定位等业务,基于Linux的通用平台进入了开发。
软件开发需要掌握的知识体系有:Uinx/Linux平台技术、企业级数据库技术、ja语言核心技术、软件工程和设计模式、Android应用开发基础、互联网核心技术、Android系统级开发、jaEE核心技术。
web前端开发工程师是一个很新的职业,是从事web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。
以前会Photoshop和Dreamweer就可以制作网页,系只能在只掌握这些已经远远不够了。无论是开发难度上,还是开发方式上,现在的网页制作更接近传统的网站后台开发,所以现在不要再叫网页制作,而是web前端开发。web前端开发在产品开发环节中的作用变得越来越重要,而且需要专业的前端工程师才能做好,这方面的专业人才近两年来备受青睐。web前端开发是一项很特殊的工作,涵盖的知识面非常广,既有具体的技术,又有抽象的理念。简单地说,它的主要职能就是把网站的界面更好的呈现给用户。
前端的难度相对要小很多,很多人都不认为前端算是程序员(链的底部,仅专略高于美工UI),觉得那属不过是HTML。
不过同级别的薪资也不如安卓、ios开发。但是人才市场上前端更稀缺,因为从业者相对于需求来说更少,很少专门的培训班,主要要靠兴趣自学。
如果有耐心和毅力,长远上看iOS开发更好,iphone开发未来几年还是很被重视的,程序员可以升级到CTO等级别。如果想快速的话就前端吧。当然先前端后再学手机开发也可以,技多不压身。
免责声明: 本文由用户上传,如有侵权请联系删除!