原型与面向对象(1)

1. 原型虽是定义对象的一种方式,但其本质依然是函数特征。

2.使用原型所定义的属性和功能都会自动应用到对象的实例上。一旦定义,原型的属性就会变成实例化对象的属性。
3.js原型的主要用途是使用一种类风格的面向对象和继承技术进行编码。

1. 对象化实例:

1.原型作为对象的概览

     function Ninja(){
        this.swingSword=true;
      };//定义一个构造函数,并且设置一个布尔类型的属性。

      let ninja=new Ninja();//new操作符调用构造器,初始化一个Ninja实例。

      Ninja.prototype.swingSword=function(){
        return true;
      }//构造器的原型上添加一个方法。

      Ninja.swingSword();//用其判断,该方法存在在该对象实例上。

函数作为构造器调用时,函数的原型是新对象的一个概览。原型可以让我们预定义属性,包括方法。这些属性和方法会自动应用在新的对象实例上。

2.实例属性

1.在构造器内创建的实例方法会阻挡在原型上面定义的同名方法。(在构造器内的绑定操作优先级永远高于在原型链绑定的操作优先级。)不是覆盖,而是附加到新创建的对象上了。


2.因为构造器内的this上下文指向的是实例自身,所以我们 可以在构造器内对核心内容执行初始化操作。

3.协调引用

不是覆盖,而是附加到新创建的对象上了,并且和对象自身的属性引用一起协调运行。步骤如下:

  1. 在引用对象的一个属性时,首先检查对象本身是否拥有,如果有,直接返回。
  2. 没有,再看对象的原型上是否有所需要的属性,如果有返回。
  3. 没有,则返回undefined.

对象由构造器实例化而来,所以,它和构造器所创建对象的原型有关。

1.每个对象都有一个constructor的隐式属性。该属性引用的时创建该对象的构造器。(在我看来就是指向,但这么表达可能不严密)。
ninja.constructor;//可以调出其构造函数


2.prototype是构造器的一个属性。所以,每个对象都有一种方法找到自己的原型。
ninja.constructor.prototype.swingSword;//调出其原型属性。

2.通过构造器判断对象类型:

对象的构造器可以通过constructor属性获得。

判断一个实例的类型以及其构造器:

function Ninjs() {}
let ninjs=new Ninjs();
 1. typeof ninjs;//object
 2. ninjs instanceof Ninjs;//true
 3. ninjs.constructor=Ninjs;//true

3.继承与原型链:

创建一个原型链最好的方法,是使一个对象的实例作为另一个对象的原型。
subClass.prototype=new superClass();
这将保持原型链,因为subClass实例的实例原型僵尸superClass的一个实例。该实例不仅拥有原型,还持有superClass的属性,并且该原型指向其自身超类的一个实例。

eg:

function Person() {};
Person.prototype.dance=function () {};

function Ninja() {};
Ninja.prototype=new Person();//将Ninja的原型设置为Person的一个实例。
ninja=new Ninja();

console.log(ninja instanceof Ninja);//true
console.log(ninja instanceof Person);//true
console.log(ninja instanceof Object);//true
console.log(typeof ninja.dance);//function

4.HTML DOM原型:


//通过给原型添加一个新方法,从而给所有元素都添加上该方法。
HTMLElement.prototype.remove=function () {
    if(this.parentNode){
        this.parentNode.removeChild(this);
    }
};
//用新方法删除节点。
document.getElementById('b').remove();

//原来的方法删除节点。
let a=document.getElementById('a');
a.parentNode.removeChild(a);

未完待续!

猜你喜欢

转载自blog.csdn.net/qq_39083004/article/details/79594386