js里的对象基本理解(原型)

220 阅读3分钟

1.全局对象

global对象=window对象, window对象的所有属性可以在MDN上查看

ECMAscript规定的一些常用属性:

parseInt.
parseFloat.
Number().
String().
Boolean().
Object()

浏览器一些私有属性:

alert()(弹窗提示)
prompt()(用户填写)
confirm()(确认)
console(开发者)
document(文档)DOM(w3c制定)

2.简单类型和对象的区别:

2.1 基本类型是存放在在栈区的
var name = "lining";
var gender = "男"
var arr = 12;

对象是放在堆区的: var person1 = {name:"lining"};
var person2 = {name:"xiaoming"};
var person3 = {name:"wanghai"}

2.2赋值方式不同

简单类型: 在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上

var a = 10;
var b = a;

a ++ ;
console.log(a); // 11
console.log(b); // 10
修改a的值,不会对b造成影响,b的值没变,该值只是a中的值的一个副本,此后, 这两个变量可以参加任何操作而相互不受影响

对象:

var person = {name:'lining'};
var person2 = person;
person2.age = "12";
console.log(person)
当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到 为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一 个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另 一个变量.

3.公用属性(protetype:原型)

所有对象都有 toString 和 valueOf 属性,那么我们是否有必要给每个对象一个 toString 和 valueOf 呢?

明显不需要。

var person = new Person();
person.sayName(); //"lining"

JS 的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象)

然后让每一个对象的__proto__ 存储这个「公用属性组成的对象」的地址。_proto_属性由浏览器支持。

我们创建的每个函数都有一个 prototype (原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那 么 prototype 就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以 让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是 可以将这些信息直接添加到原型对象中。

无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个 prototype 属性,这个属性指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个 constructor (构造函数)属性,这个属性包含一个指向 prototype 属性所在函数的指针。就拿前面的例子来说, Person.prototype. constructor 指向 Person 。而通过这个构造函数,我们还可继续为原型对象 添加其他属性和方法。

4.重要公式

注意大小写,number 和 Number 是不同的

var 对象 = new 函数() 对象.proto === 对象的构造函数.prototype

// 推论 var number = new Number() number.proto = Number.prototype

var object = new Object() object.proto = Object.prototype

var function = new Function() function.proto = Function.prototype

// 另外,所有函数都是由 Function 构造出来的,所以 Number.proto = Function.prototype // 因为 Number 是函数,是 Function 的实例 Object.proto = Function.prototype // 因为 Object 是函数,是 Function 的实例 Function.proto == Function.prototye // 因为 Function 是函数,是 Function 的实例!

未完待续……