th=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>变量的动态监听</title>
</head>
<body>
<button id="btn" onclick="test()">点击</button>
<p id="p">0</p>
</body>
<script src="test.js" charset="utf-8"></script>
<script type="text/java script">
function test(){
watchVal.value = ++watchVal.value;
let info = document.getElementById("p");
info.innerHTML = watchVal.value;
console.log(watchVal.value);
}
</script>
</html>
js代码如下:
// 变量监听
var watchVal = {
value:0,
get val(){
console.log('取值:',this.value);
return this.value;
},
set val(vals) {
this.value = vals;
console.log("存储之后的值",this.value);
}
}
原型和原型链
在诸多面向对象编程语言当中,封装
、继承
、多态
是必备的内容,而在js这门基于对象的编程语言身上,想要实现其诸多特性,只能
通过prototype
原型来实现。
我们可以先来通过代码来简单的体验一下原型:
// 创建一个数组
var arr = [1,2,3,4];
// 打印这个数组
console.log(arr);
你可以在打印的结果中最后看到一个属性__proto__
。
你过你尝试着将其打印,你会发现其中包含了Array
的属性和方法。
它是什么呢?
它其实就是数据arr数组
的原型,而__proto__
表述的其实就是数组的原型链.
你需要知道的是,在js当中,__proto__
就是数据原型的代表,我们可以通过其向我们创建的数组中添加方法:
例如:
// 创建一个数组
var arr = [1,2,3,4];
// 打印这个数组
console.log(arr);
// 向数组的原型上添加一个sayHello()方法
arr.__proto__.sayHello = function(){
console.log("hello,world!");
}
arr.sayHello();
我们在开发的过程中,更多的是采用下面的写法:
// 创建一个数组
var arr = [1,2,3,4];
// 打印这个数组
console.log(arr);
// 向数组的原型上添加一个sayHello()方法
Array.prototype.sayHello = function(){
console.log("hello,world!");
}
arr.sayHello();
在上面的代码中,prototype
同样表示着原型,只不过更多的时候是被应用在构造函数的身上。Array
是数组对象的原型
,它是一个构造函数,所以可以通过这个属性来进行方法的设置。
当数据是一个构造函数的时候,prototype的使用方式还可以进行简化:
function Person(){
}
Person.prototype = {
sayHello:function(){
console.log(111)
}
}
var a = new Person();
a.sayHello();
面向对象
在编程领域,面向对象是一种常见的编程范式,也被成为OOP
,ECMASript支持包括结构化、面向对象、函数式、命令式等多种编程方式。
下面要说的就是面向对象编程的内容。
MDN说明:
面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式。它使用先前建立的范例,包括模块化,多态和封装几种技术。今天,许多流行的编程语言(如Java,java script,C#,C+ +,Python,PHP,Ruby和Objective-C)都支持面向对象编程(OOP)。
相对于「一个程序只是一些函数的集合,或简单的计算机指令列表。」的传统软件设计观念而言,面向对象编程可以看作是使用一系列对象相互协作的软件设计。 在 OOP 中,每个对象能够接收消息,处理数据和发送消息给其他对象。每个对象都可以被看作是一个拥有清晰角色或责任的独立小机器。
面向对象程序设计的目的是在编程中促进更好的灵活性和可维护性,在大型软件工程中广为流行。凭借其对模块化的重视,面向对象的代码开发更简单,更容易理解,相比非模块化编程方法, 它能更直接地分析, 编码和理解复杂的情况和过程。
面向对象编程术语:
Namespace 命名空间
允许开发人员在一个独特,应用相关的名字的名称下捆绑所有功能的容器。
Class 类
定义对象的特征。它是对象的属性和方法的模板定义。
Object 对象
类的一个实例。
Property 属性
对象的特征,比如颜色。
Method 方法
对象的能力,比如行走。
Constructor 构造函数
对象初始化的瞬间,被调用的方法。通常它的名字与包含它的类一致。
Inheritance 继承
一个类可以继承另一个类的特征。
Encapsulation 封装
一种把数据和相关的方法绑定在一起使用的方法。
Abstraction 抽象
结合复杂的继承,方法,属性的对象能够模拟现实的模型。
Polymorphism 多态
多意为「许多」,态意为「形态」。不同类可以定义相同的方法或属性。
JS当中的命名空间
命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能。 在java script中,命名空间只是另一个包含方法,属性,对象的对象。
创造的java script命名空间背后的想法很简单:一个全局对象被创建,所有的变量,方法和功能成为该对象的属性。使用命名空间也最大程度地减少应用程序的名称冲突的可能性。
例如:
我们来创建一个全局变量叫做 MYAPP
// 全局命名空间
var MYAPP = MYAPP || {};
在上面的代码示例中,我们首先检查MYAPP是否已经被定义(是否在同一文件中或在另一文件)。如果是的话,那么使用现有的MYAPP全局对象,否则,创建一个名为MYAPP的空对象用来封装方法,函数,变量和对象。
我们也可以创建子命名空间:
// 子命名空间
MYAPP.event = {};
下面是用于创建命名空间和添加变量,函数和方法的代码写法:
// 给普通方法和属性创建一个叫