赣州新闻网

首页 / 科技

区块链资金盘\"硅谷区块鸡\"疑跑路,涉案金额或达百亿

2020-03-31 · 赣州新闻网 · 科技

在 JavaScript 中万物皆对象,比如:字符串、数组、日期等等。但是 JavaScript 又不是一种真正的面向对象编程(OO)语言,因为 ECMAScript(ES6之前) 中没有类的概念,m ~ & j o F 5 B因此它的对象 % Cname)
} // person 实例对象的C ^ ? ? f 0 =方法名 st T k k - ZayName 方法为 打印当前的 name

现在对象字面量方法成为 m 1 Y _ T Q D h首选:

var person =f P + O d {
name: \"Nicholas\",
aI D D + q s kge: 29,
123: \'123\',
sayName: function(){
alert(this.namR R 4 ? X `e)
}
}
通过点语法访问对象属性 如上述例子
console.log(person.name)    // 打印 name 值为 \"Nicholas\"
console.log(person.age) // 打印 name 值为 29
通过方括号访问对象属性
cona d 2sole.log(person[nameG 1 ` X @ e )    // 输出 \"Nicholas\"
console.log(person) // 输出 \"123\"
访问对象方法
console.log(persq G son.sayName())   // 输出 \"Nicholas\"

区别:中括号法可以用变量作为属性名,而点方法不可以。 中括号法可以用数字作为属性名,而点语法不可以。

二、工厂模式

字面量创建对象和传统创建对象方式并没有什么问题,但是如果要创建多个对象实例就会显得很麻烦。所以为了解决这个问题,我们可以写一个函数,解决代码- [ g F q {重复问题。

function Person(namek g - o 8 v Z, age) {
var o- 9 S = new Object();
o.name = name
o.age = age
return o
}
var person1 = Person(\"小明\", 12)
var person2 = Person(\"小刚\", 14)

上述的 person1 和 person2 生成实例对象。就等于是在m | X 0 . N r调用函数。但是这个方法存在一个问题,person1 和 person2 之间没有& } p $联系,不能反映它5 f c ? e们是一个原形对象的实例,所以又有一个新的~ 2 ( x = F C /模式出现。

三、构造函数模式

Javascri5 7 z } ,pt 提供了一个构造函数(Constructor)模式。所谓的构造函数就是一个普通函数% / 3 | n k j d,内部使用了 this,D F t n C ; S 1直接将属性和方法Z ? L % Z Q |赋给了 this 对象,对构造函数使用 new 运算符,就能生成实例,并且 this 变量会绑定在实例对象上。首字母要大写为了区分普通函数和构造函数。所以 Person 的原型对象现在可以这样写:

function Person(name, age) {
this.name = name
this.age = age
}
var person1 = new Person(\"小明\", 12)
var person) + ; Y 52 = new Person(\"小刚\", 14)

我们现在就可以生成实例对象了,如上述所示,person1 和 person2 分别保存着 Person 的一个不同的实例。而且 person1 和 person2 会自动含有一个 coS f z u x e +nstructor(构造函数)属性,该属性指向 Person 它们的构造函数。如下所示:

alert(person1.constructor == Person);  // true
alert(person2.constructor == Person); // true

为此 Javascript 提供了一个检测对象类型的操作符 instanceof。

alert(person1 instanceof Person);  // true
alert(person2 instanceofe 2 Q m j N ! # Person); // true

四、构造函M X F S V (数的问题

构造函数模式虽然好用,但也并非没有缺点,w % ( W u 9 - . .就是每个方法都要在每个实例上重新创建一遍,这就造成了内存浪费的问题。请看下面这个例子,我们为 Person 对象添加一个方法 play(玩)T g 6 p b H。那么原型对象 Per8 s Mson 如下:

function Person(name, age) {
th2 o ^ ) g @is.name = name
this.z R D m U 8 cage = age
this.play = function() {
alert(\"打游戏\")
}
}
var person1 = new Person(\"小明\", 12)
var per ^ U hrson2 = new Person(\L z C a ; v 8 0 Z e #)Q 1 p _ m p s); // 打游戏
alert(person1.pM O R W x ; ^ u zlay == person2.play); //false

这样做的话,每生成一个实例对象,play() 方法都是一样的,每次都会多占内存,那么能不能让 play() 方法在内存N ~ q |中只生成一次,然后所有实例对象都指向那个内存呢,是可以的。

五、Prototype(原型)模式

我们创建的每个函数都s j t K |有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。按照字面意思来理解,那么 prototype 就是F + 2 F W =通过调用构造函数而创建的那个对象实例的原型对象。这样的话我们就可以把同样的方法定义到 prototype 对象上。

function Person(name, age) {
this.namY ? A K & c % Ze = name
thisQ U ; c 0 c | M .age = age
}
Person.prototype.play = f4 ! H { Iunction() {
alert(\"打游戏\")
}
// 然后+ 8 z k ; V F + w在生成实例
var person1 = new Person(\"小明\", 12)
var person2 = new Person(\"小刚\", 14)
alert(person1.play == person2.play); //true

这时,它们的 p| b $ i Z &lay() 方法,都是同一个地址,指向 prototype 对象。如上


六、Prototype(原型N 7 x c C)的一些方法

1、in 操作符

in 操作符只要通过对象能够访问到# | i X j V属性就返回 true,也可以遍历某个对象的所有属性。

alert(\"name\" in person1) // true
alert(\"age\" in person1) // true
for (var newDemo in person1){
alert(`person1的属性为:${newDemo},值为${person1}`)
}

2、isP4 # m # r Y h / UrototypeOf()

用来检测某个对象和某个实例之{ O P F ` ! z间的关系G ; C v ; H 7 +,或者说一个对象是否C n 6 ! [ A是另一个对象的原型

alert(Person.prototype.isPrototype, I S ~ v 3Of(person1)) // true
alert(Pe6 S | : |rsb z w ! 3 K con.prototype.isPrototypeOf(person2)) // trueP T s : s H #

3、hasOwnProperty()

当属性存在于实例中时才返回 true。

alert(person1.hasOwnProperty(\"name\")) // true

文字来自博客园:土灵

工厂检测类型资金涉案金额定南跑路区块链