JavaScript 原型的一些知识

#01 面向对象的三大特性是什么,请分别说明。

封装、继承、多态

#02 为什么要使用面向对象编程,有哪些优点。

当有很多个类似功能的需求时,如果使用面向过程的方式编程会有很多重复的代码造成资源浪费(代码冗余)、

而且不利于分析代码(结构性差)、

创造过多的方法和属性会污染window域(全局污染)

==========================================================

如果使用面向对象的方式来编程可以将相同功能的代码放在一个构造函数中来,

以后需要使用只需要调用传参就OK了,

相对面向过程来说相同的功能调用的是同一个函数,

不会创造很多的相同功能的函数(减少资源占用)、

代码量少且相同的功能只有一个函数,类似css的类!只要给这一个构造函数写上注释说明即可(简单方便)、

在构造函数中,所有的属性和方法的作用域只存在于这个构造函数中,不会造成全局的变量和函数污染!


#03 构造函数和原型对象的关系是什么。

只有创建了一个构造函数时原型才会随着函数的创建而创建。

构造函数和原型的关系就好比父子关系。没有老子何来儿子?


#04 说明自定义构造函数创建的执行过程。

创建一个自定义构造函数:

首字母大写(一般约定)

系统默认声明了一个新的Object对象

系统默认返回了这个新创建的Object


#05 面向对象和面向过程编程有什么区别。

面向过程->亲力亲为、每件事具体到每一个细节和过程(创建方法》给方法添加属性》使用方法》)

面向对象->直接使用功能,而不去关注这些功能是怎么实现的(获取方法》使用方法)


#06 构造函数的原型对象的作用是什么。

构造函数中存在的属性和方法是实例属性和实例方法,而原型的属性和方法是原型属性和原型方法。

当使用构造函数创造了多个新的函数A和B时,调用构造函数中的一个方法fn时,

默认此函数A和函数B调用构造函数的方法却不是同一个fn方法!

这样就会造成资源浪费,这时如果使用构造函数原型来创造fn这个方法,那么函数A和函数B调用的fn都是同一个fn。

同样的功能一个方法就能实现 减少了资源的浪费 可以提高性能。

#07 如何获取构造函数的原型对象[2]。

function Person(name){

this.name = name
}

Person.prototype.name

#08 简单介绍创建对象的几种方式,并说明它们都存在哪些问题。

1.通过字面量的方式创建对象:只适合少量的对象。

缺点很明显,当创建多个功能相同的对象时,代码重复(浪费资源)。

var stu1 = {
name :"zs",
age:20,
num:110,
className:"葵花宝典班",
study:function () {
console.log("学习");
}
};


2.通过构造函数来创建对象

构造函数复用性不好,因为创建的对象无法复用,创建同类型的对象,有大量冗余的代码。

var obj= new Object

obj. name :"zs",
obj. age:20,
obj. num:110,
obj. className:"葵花宝典班",
obj. study:function () {
console.log("学习");
}


3.工厂方式

当这个模具创建多个不同的类型的对象时,无法分辨。

instanceof 用于判断一个变量是否某个对象的实例


function student(name,age){

//原料 name age Object

var stu1 = new Object();

//加工
stu1.name=name;
stu1.age=name;
stu1.showName=function(){
console.log(this.name)
}

//出厂
return stu1;
}


4.自定义构造函数

首字母大写、系统默认会创建一个空的对象并且赋值给this,最后系统默认会返回新对象。

返回值有两种情况!
当手动指定返回值时,如果值是简单数据类型会忽略。
如果是引用类型时会返回该引用类型的值


当实例化出多个对象时调用构造函数的方法却不是同一个方法,而是给每个实例化的对象都创建一个新的方法,
这样相同功能的方法因为有多个实例化的对象而创建多次。造成资源浪费!

而如果把构造函数中的方法拿到外面变成全局函数可以解决这个问题。但是如果构造函数中有很多的方法时,那么如果都变成全局变量的话就会造成全局变量污染。并会破坏封装性。

function Person(name,age){

//系统默认创建了一个空的对象 var obj=new Object();
//系统默认把obj赋值给this this = obj;
this.name=name;
this.age=age;
this.showName=function(){
console.log(this.name)
}
//系统默认把结果返回给新创建的对象
}

var p1 = new Person('张三',20)



5.通过原型来改造自定义构造函数的全局变量污染问题

把构造函数中的方法添加到原型上,这样的话通过构造函数实例化的对象都能使用构造函数原型上的方法

并且多个实例化对象调用的方法是同一个方法!减少了资源的占用、没有全局变量的污染。

这就是面向对象的继承


function Person(name,age) {
this.name = name;
this.age = age;
}

Person.prototype.showName = function () {

console.log(this.name)
}

var p1 = new Person('张三', 88);
var p2 = new Person('王麻子', 33);


p1.showName();
p2.showName();

console.log(p1.showName === p2.showName); //true

 

 

#09 说明实例和实例化。

实例化就是使用构造函数创建一个新的函数时的一个过程。

实例就是构造函数中的属性和方法。

posted on 2017-04-07 10:13  gogeek  阅读(121)  评论(0)    收藏  举报