JS对象、原型

174 阅读2分钟

对象

  • 对象的创建方法
  1. var obj = {} 对象字面量/对象直接量(plainObiect)

  2. 构造函数

1)系统自带的构造函数 Object()

var obj = new Object();
  1. 自定义

构造函数和函数在结构上没有任何区别,构造函数在命名上严格符合大驼峰式命名规则。

//自定义构造函数
function Person() {
	name = "Ming";
    age = 0;
    say = function() {
    	console.log("Hello!");
    }
}
var person1 = new Person();
  • 属性的增、删、改、查

增、改、查都直接写就可以,删要借助 delete

person.sex;				//增
delete person.age;		//删
person.age = 18;		//改
person.age;				//查
  • 构造函数的内部原理
  1. 在函数体最前面隐式的加上var this = {}

  2. 执行this.xxx = xxx

  3. 隐式的返回this

包装类

var num = new Number(123);
var str = new String('abc');
var bol = new Boolean('true');
//undefined和null不能设置属性

数字有原始值数字和数字对象。原始值数字不能有属性和方法,对象可以。

var num = 4;
num.len = 3;
//原始值应该是不能有属性的,但运行却没有报错,访问 len 属性的结果是 undefined
//原始值不能有属性,如果非得增加属性,系统会隐式的 new Number(4).len = 3
//然后再把刚刚new的删掉

console.log(num.len);
//此时系统会再次new Number,这个刚刚new的是没有len属性的,就会返回undefined

下面有两道题

var str = "abcd";
str.length = 2;
					//new String('abcd').length = 2; --> delete
console.log(str);	//abcd
var str = "abc";
str += 1;
var test = typeof(of);		//test = String
if(test.length == 6){		//true
	test.sign = "typeof的返回结果可能为String";
    						//new String(test).sign = ... --> delete
}
console.log(test.sign);		//undefined

原型

原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。

Person.prototype.name = "Li";		//prototype是系统自带的一个属性
function Person() {

}
var person = new Person();
var person1 = new Person();
									//person.name和person1.name的结果都为 li
  • 对象如何查看对象的构造函数 --> constructor

constructor会返回构造这个对象的构造函数。

function Person() {
	
}
	function Car() {

}
var car = new Car();
Car.prototype.constructor = Person;	//constructor的值是可以更改的
									//car寻找自己的构造函数就会返回Person
  • ** proto **
function Person() {
	//var this = {
    //	__proto__: Person.prototype;
    //}
   				//当访问这个对象属性时,如果没有这个属性,就会通过proto指向的索引,
    			//去找Person.prototype里有没有这个属性。
}

原型链

  • 构成原型链
Grand.prototype.lastName = "Li";
function Grand() {
}
var grand = new Grand();

Father.prototype = grand;
function Father() {
	this.name = "xiaoming";
}
var father = new Father();

Son.prototype = father;
function Son() {
	this.hobbit = "sing";
}
var son = new Son();

son.name
son.lastname	//想访问这个属性,自身没有,会沿着prototype往上找

这样把原型连成链就是原型链,原型链的链接点就是proto

  • Object.creat(原型)
Person.prototype.name = "sunny";
function Person() {
}
var person = Object.creat(Person.prototype)

所有对象的最终都会继承自Object.prototype --> 这句话是错误的

Object.creat()括号里可以放null,这时构造的对象就没有原型,没有proto属性。